精华内容
下载资源
问答
  • Lua C++交互机制

    千次阅读 2017-08-16 16:13:46
    一、Lua与C++的交互机制——Lua堆栈1)交互机制Lua和C++ 的交互机制的基础在于Lua提供了一个虚拟栈,C++ 和Lua之间的所有类型的数据交换都通过这个栈完成 栈中每个元素都能保存任何类型的Lua值(实际上Lua的任何类型...

    一、Lua与C++的交互机制——Lua堆栈

    1)交互机制

    Lua和C++ 的交互机制的基础在于Lua提供了一个虚拟栈,C++ 和Lua之间的所有类型的数据交换都通过这个栈完成。无论何时C想从Lua中调用一个值,被请求的值将会被压入栈,无论何时C想要传递一个值给Lua,首先将整个值压栈,然后就可以在Lua中调用。
    栈中每个元素都能保存任何类型的Lua值(实际上Lua的任何类型的值包括字符串、表等等,最终都是以TValue这种数据结构来保存的)
    当在C代码中要获取Lua的一个值的时候,只需要调用Lua API将指定值压入栈中,C再获取栈值
    API有一系列的压栈函数,为了将栈顶的Lua值转换成C值,我们为每种类型定义一个对应的函数:

    void lua_pushnil(Lua_State *L);
    void lua_pushboolean(Lua_State *L,int bool);
    void lua_pushnumber(Lua_State *L,double n);
    void lua_pushstring(Lua_State*L,const char*s);
    void lua_pushuserdata(Lua_State*L,void*p);

    API有一系列的从栈中获取值的函数,为了将栈中的转换C值成Lua值

    bool lua_toboolean(Lua_State*L,int idx);
    int lua_tonumber(Lua_State*L,int idx);
    const char* lua_tostring(Lua_State*L,int idx,size_t *len);
    void* lua_touserdata(Lua_State*L,int idx);

    Lua API还提供了一套lua_is*来检查一个元素是否是一个指定的类型

    int lua_isboolean(Lua_State*L,int idx);
    int lua_isnumber(Lua_State*L,int idx);
    int lua_isstring(Lua_State*L,int idx);

    此外还提供了API函数来人工控制堆栈:

    int lua_gettop(luaState *L);
    void lua_settop(luaState *L,int idx);
    void lua_pushvalue(luaState *L,int idx);
    void lua_remove(luaState *L,int idx);
    void lua_insert(luaState *L,int idx);
    void lua_replace(luaState *L,int idx);

    Lua API函数参照官方手册:http://www.lua.org/manual/5.3/

    Lua中,对虚拟栈提供正向索引和反向索引两种索引方式,假设当前Lua的栈中有5个元素,如下图所示:
    image
    当C和Lua互相调用的时候,Lua虚拟栈严格的按照LIFO规则操作,只会改变栈顶部分。但通过Lua的API,可以查询栈上的任何元素,甚至是在任何一个位置插入和删除元素。

    2)示例

    以字符串和数字值为例试一下对Lua栈的操作
    环境:IDE Clion
    资源:Lua源文件包中除了lua.c和luac.c(这两个源文件中都有main函数,其中lua.c编译之后就是我们常用的lua.exe)的所有源文件 源文件下载地址
    配置CMakeLists.txt

    cmake_minimum_required(VERSION 3.8)  
    project(luac)  
    
    set(CMAKE_CXX_STANDARD 11)  
    
    set(SOURCE_FILES main.cpp ltablib.c lauxlib.c lbaselib.c lapi.c lbitlib.c lcode.c lcorolib.c lctype.c ldblib.c ldebug.c ldo.c ldump.c lfunc.c lgc.c linit.c liolib.c llex.c llimits.h lmathlib.c lmem.c loadlib.c lobject.c lopcodes.c loslib.c lparser.c lstate.c lstring.c lstrlib.c ltable.c ltm.c lundump.c lutf8lib.c lvm.c lzio.c)  
    add_executable(luac ${SOURCE_FILES})

    main.cpp

    #include "lua.hpp"  
    #include <iostream>
    int main()
    {
        //创建一个state
        lua_State *L = luaL_newstate();
        //入栈
        lua_pushstring(L,"i am testing lua & c++");
        lua_pushnumber(L,123);
    
        //读栈取值
        if(lua_isstring(L,-2))//或if(lua_isstring(L,1))
        {
            std::cout<<lua_tostring(L,-2)<<std::endl;
        }
        if(lua_isnumber(L,-1))
        {
            std::cout<<lua_tonumber(L,-1)<<std::endl;
        }
    
        //关闭state
        lua_close(L);
        return 0;
    }

    image

    补充:

    ++Lua虚拟栈在源码中是如何实现的++:
    Lua栈是在创建lua_State时建立的,TValue stack[max_stack_len]  // 欲知内情可以查 Lua源码lstate.c的stack_init函数
    Lua栈可以存储数字,字符串,表,闭包等,它们最终都用TValue这种数据结构来保存
    image
    TValue结构对应于lua中的所有数据类型, 是一个{值, 类型} 结构, 这就lua中动态类型的实现, 它把值和类型绑在一起, 用tt记录value的类型, value是一个联合结构, 由Value定义, 可以看到这个联合有四个域, 先说明简单的
    p – 可以存一个指针, 实际上是lua中的light userdata结构
    n – 所有的数值存在这里, 不过是int , 还是float
    b – Boolean值存在这里, 注意, lua_pushinteger不是存在这里, 而是存在n中, b只存布尔
    gc – 其他诸如table, thread, closure, string需要内存管理垃圾回收的类型都存在这里
    gc是一个指针, 它可以指向的类型由联合体GCObject定义, 从图中可以看出, 有string, userdata, closure, table, proto, upvalue, thread
    可以的得出如下结论:
    1. lua中, number, boolean, nil, light userdata四种类型的值是直接存在栈上元素里的, 和垃圾回收无关.
    2. lua中, string, table, closure, userdata, thread存在栈上元素里的只是指针, 他们都会在生命周期结束后被垃圾回收

    二、C++ 调用 Lua

    C++ 可以获取Lua中的值,可以调用Lua函数,还可以修改Lua文件

    1)C获取Lua值

    1. 使用lua_getglocal来获取值,然后将其压栈
    2. 使用C API lua_toXXX将栈中元素取出转成相应的C类型的值

    如果Lua值为table类型的话,通过lua_getfield和lua_setfield获取和修改表中元素的值

    2)C调用Lua函数

    1. 使用lua_getglobal来获取函数,然后将其压入栈;
    2. 如果这个函数有参数的话,就需要依次将函数的参数也压入栈;
    3. 这些准备工作都准备就绪以后,就调用lua_pcall开始调用函数了,调用完成以后,会将返回值压入栈中;
    4. 最后取返回值得过程不用多说了,调用完毕。

    示例:

    新建一个简单的lua文件名为luac.lua放到生成exe的同级目录下
    luac.lua

    name = "xchen"
    version = 1
    me = { name = "xchen", gender = "female"}
    function add (a,b)
        return a+b
    end

    main.cpp

    #include "lua.hpp"
    #include <iostream>
    using namespace std;
    
    //显示栈内情况
    static void stackDump(lua_State* L);
    
    int main()
    {
        //创建一个state
        lua_State *L = luaL_newstate();
        luaL_openlibs(L);
    
        //读lua文件
        int fret = luaL_dofile(L,"luac.lua");
        if(fret)
        {
            std::cout<<"read lua file error!"<<std::endl;
        }
    
        //读取变量
        lua_getglobal(L,"name");   //string to be indexed
        std::cout<<"name = "<<lua_tostring(L,-1)<<std::endl;
    
        //读取数字
        lua_getglobal(L,"version"); //number to be indexed
        std::cout<<"version = "<<lua_tonumber(L,-1)<<std::endl;
    
        //读取表
        lua_getglobal(L, "me");  //table to be indexed
        if(!lua_istable(L,-1))
        {
            std::cout<<"error:it is not a table"<<std::endl;
        }
        //取表中元素
        lua_getfield(L, -1 ,"name");
        std::cout<<"student name = "<<lua_tostring(L,-1)<<std::endl;
        lua_getfield(L,-2,"gender");
        std::cout<<"student gender = "<<lua_tostring(L,-1)<<std::endl;
    
        //修改表中元素
        lua_pushstring(L, "007");
        lua_setfield(L,-4, "name");
        lua_getfield(L, -3 ,"name");
        std::cout<<"student newName = "<<lua_tostring(L,-1)<<std::endl;
    
        //取函数
        lua_getglobal(L,"add");
        lua_pushnumber(L,15);
        lua_pushnumber(L,5);
        lua_pcall(L,2,1,0);//2-参数格式,1-返回值个数,调用函数,函数执行完,会将返回值压入栈中
        std::cout<<"5 + 15 = "<<lua_tonumber(L,-1)<<std::endl;
    
        //查看栈
        stackDump(L);
    
        //关闭state
        lua_close(L);
        return 0;
    }
    
    static void stackDump(lua_State* L) {
        cout << "\nbegin dump lua stack" << endl;
        int i = 0;
        int top = lua_gettop(L);
        for (i = 1; i <= top; ++i) {
            int t = lua_type(L, i);
            switch (t) {
                case LUA_TSTRING: {
                    printf("'%s' ", lua_tostring(L, i));
                }
                    break;
                case LUA_TBOOLEAN: {
                    printf(lua_toboolean(L, i) ? "true " : "false ");
                }
                    break;
                case LUA_TNUMBER: {
                    printf("%g ", lua_tonumber(L, i));
                }
                    break;
                default: {
                    printf("%s ", lua_typename(L, t));
                }
                    break;
            }
        }
        cout << "\nend dump lua stack" << endl;
    }

    ![image](
    https://img-blog.csdn.net/20170816160051151)

    三、Lua 调用 C++

    Lua可以调用由C++定义、实现具体的函数
    步骤:
    1. 将C的函数包装成Lua环境认可的函数
    1. 将包装好的函数注册到Lua环境中
    1. 像使用普通Lua函数那样使用注册函数

    包装C函数

    为了从Lua脚本中调用C函数,需要将被调用的C函数从普通的C函数包装成Lua_CFunction格式,并需要在函数中将返回值压入栈中,并返回返回值个数:

    int (Lua_CFunction*)(lua_state*)
    {
        // c code        // 实现逻辑功能
        // lua_push code // 需要将返回值压入堆栈
        return n;        // n为具体的返回值个数,告诉解释器,函数向堆栈压入几个返回值
    }

    例如

    int add(int a,int b)
    {
        return a+b;
    }

    包装为:

    int add(lua_state*L)
    {
        int a = lua_tonumber(-1);
        int b = lua_tonumber(-2);
        int sum = a+b;
        lua_pushnumber(L,sum);
        return 1;
    }

    注册C函数到Lua环境

    将函数压栈,然后给函数设置一个在Lua中调用的名称

    // 参数n为Lua注册的函数名,f为对应的c函数名
    lua_register(L,n,f);

    lua_register是一个宏,对应两个函数:lua_pushfunction(L,f)和lua_setglobal(L,n),将函数存放在一个全局table中。

    lua_register(L,"Add2Number",add);//将c函数add注册到全局table[Add2Number]中

    使用注册函数

    像使用普通函数一样使用注册函数

    Add2Number(1,2);

    示例

    test.lua

    print("Hi! " .. sayHi("xchen"))

    main.cpp

    #include "lua.hpp"
    #include <iostream>
    using namespace std;
    //C++中定义、实现函数sayHi
    int sayHi(lua_State *L)
    {
        //获取lua函数中的第一个参数
        string name = luaL_checkstring(L,1);
        //压栈
        lua_pushstring(L,name.data());
        return 1;
    }
    int main()
    {
        //创建一个state
        lua_State *L = luaL_newstate();
        luaL_openlibs(L);
    
        //为Lua注册名为第一个参数的函数,实际上是调用c++中第三个参数名的函数
        lua_register(L, "sayHi" ,sayHi);
    
        //读lua文件并运行Lua code
        int fret = luaL_dofile(L,"test.lua");
        if(fret)
        {
            std::cout<<"read lua file error!"<<std::endl;
        }
    
        //关闭state
        lua_close(L);
        return 0;
    }

    image

    四、小细节

    关于lua.hpp
    lua.hpp是我们在使用C++调用lua时要添加的头文件,它的内容如下:

    // lua.hpp
    // Lua header files for C++
    // <<extern "C">> not supplied automatically because Lua also compiles as C++
    
    extern "C" {
    #include "lua.h"
    #include "lualib.h"
    #include "lauxlib.h"
    }

    其中,extern “C”的主要作用就是为了能够正确实现C++ 代码调用其他C语言代码。加上extern “C”后,会指示编译器这部分代码按c语言的进行编译,而不是C++ 的。由于C++ 支持函数重载,因此编译器编译函数的过程中会将函数的参数类型也加到编译后的代码中,而不仅仅是函数名;而C语言并不支持函数重载,因此编译C语言代码的函数时不会带上函数的参数类型,一般之包括函数名。
    这个功能十分有用处,因为在C++ 出现以前,很多代码都是C语言写的,而且很底层的库也是C语言写的,为了更好的支持原来的C代码和已经写好的C语言库,需要在C++ 中尽可能的支持C,而extern “C”就是其中的一个策略。
    这个功能主要用在下面的情况:
    1、C++ 代码调用C语言代码
    2、在C++ 的头文件中使用
    3、在多个人协同开发时,可能有的人比较擅长C语言,而有的人擅长C++,这样的情况下也会有用到
    参考:
    http://blog.csdn.NET/xiaoluoshan/article/details/53155758
    http://www.jikexueyuan.com/course/36_6.html?ss=1
    http://www.jellythink.com/archives/554
    https://wenku.baidu.com/view/34f8f442a8956bec0975e307.html
    http://blog.csdn.net/fengbangyue/article/details/7342045

    展开全文
  • VTK交互机制

    千次阅读 2014-10-29 22:18:44
    VTK交互机制:    类vtkRenderWindowInteractor被用来获取绘制窗口上发生的鼠标和键盘事件,然后把这些事件分发到另一个类——vtkInteractorStyle。因此,要增加新的交互方式到VTK里的话,应该先从...

    VTK交互机制:

       

        类vtkRenderWindowInteractor被用来获取绘制窗口上发生的鼠标和键盘事件,然后把这些事件分发到另一个类——vtkInteractorStyle。因此,要增加新的交互方式到VTK里的话,应该先从vtkInteractorStyle派生出一个子类,如:vtkInteractorStyleTrackball, vtkInteractorStyleJoystickActor, vtkInteractorStyleJoystickCamera, vtkInteractorStyleUser等。vtkInteractorStyleUser允许用户自定义交互方式。

        实际上,vtkRenderWindowInteractor的工作方式是这样的:这个类会截取发生在与它关联的vtkRenderWindow(通过vtkRenderWindowInteractor的SetRenderWindow()方法加入的那个绘制窗口)上的事件,然后,vtkRenderWindowInteractor类会根据具体的设备以及操作系统实例化一个对象,比如说,Unix下是vtkXRenderWindowInteractor,而Windows下则是vtkWin32RenderWindowInteractor。当vtkRenderWindowInteractor::Start()方法被调用时,事件的截取功能就会被激活。最后,这些所截取的事件会被送往vtkRenderWindowInteractor::InteractorStyle这个实例进行处理。InteractorStyle是vtkRenderWindowInteractor类里面的一个保护的数据成员,是vtkInteractorObserver类型的指针,而vtkInteractorObserver是被vtkRenderWindowInteractor调用的类,它的作用是监测所发生的事件,这样,由vtkRenderWindowInteractor所截取的消息就有了归宿。

        VTK里定义好的主要的交互类型有:

        vtkInteractorStyleJoystickActor/Camera; vtkInteractorTrackballActor/Camera; vtkInteractorStyleSwitch;

    vtkInteractorStyleTrackball; vtkInteractorStyleImage; vtkInteractorStyleFlight; vtkInteractorStyleUnicam; vtkInteractorStyleUser等。其中vtkInteractorStyleImage是专为显示图像(vtkImageActor)时设计的交互方式,用这种交互方式可以通过鼠标运动,调节图像的窗宽/窗位,放大/缩小等操作。

        在VTK里,什么类能响应什么事件,一般都是预先定义好的,当然用户也可以自定义对这些事件的响应。所有的Filter(即vtkProcessObject的子类)都可以调用: StartEvent; EndEvent; ProgressEvent。可以用截取这些事件,在Filter处理数据的过程中给用户一些反馈的信息,如该Filter的处理时间等。当vtkRenderWindow绘制时,可以调用事件:AbortCheckEvent。

    来源:http://blog.163.com/jacky_ling0/blog/static/137392571201001873531167/

    展开全文
  • 课件与平台交互机制

    2007-05-09 09:11:00
    在SCORM标准中专门定义了课件与平台交互机制,称为运行时环境(Run-Time Environment),我一直在考虑这个问题:课件为什么需要与平台交互?有很多非标准的课件,它们是不需要与平台交互的,下载就可以用。而SCORM...
    在SCORM标准中专门定义了课件与平台交互的机制,称为运行时环境(Run-Time Environment),我一直在考虑这个问题:课件为什么需要与平台交互?有很多非标准的课件,它们是不需要与平台交互的,下载就可以用。而SCORM课件是平台依赖性的,没有平台就不能播放。由于必须有平台做支持,因此没有授权的用户是不能观看的,这样课件的知识产权就得到了保护,课件制作商的利益就得到了保护,课件制作商的开发课件的动力就有了保证。由于大家都遵循SCORM课件标准,课件的制作是不依赖于平台的,课件就可以卖给不同的平台,平台运作商也可以采购不同厂家的课件,对于平台来说,可以解决内容来源的问题,运营商可以专心做好运营,制作商可以专心做课件,这也体现专业分工的问题。

    课件与平台交互还有别的好处,最主要的一点是学习路径的影响和学习过程信息的记录。在每一个课件里都有一个Manifest文件,这个文件已经定义了一个课件的学习路径,这个路径通过平台的解析反映到用户的界面上。这个过程还没有涉及到交互问题。当学员开始学习的时候,学员学习的信息就可以反馈到平台,平台可以依据这些信息确认学员学习的情况,这些信息可以进一步学习路径各个结点的状态,从而保证学员是按照一定的学习路径完成学习的。同时学员在学习过程中信息也被保存下来,可以为平台进一步的使用。

    课件与平台如何进行交互,标准中做了详细的定义,包括信息访问方式和数据模型。标准对采用何种技术手段则是开放的。下图描述了这种交互的机制。



    这里需要注意,只有SCO才有交互的功能,普通的Asset是没有交互能力的。用户在登录平台时,会在客户端创建一个对象API,它是课件与平台交互的桥梁。我们知道课件其实是从服务器端下载到客户端运行的,所以在标准中定义了课件是如何在客户端找到这个API对象的,注意在SCORM1.2和Scorm2004这个对象的名称是不一样的。我们一个同事就曾经犯过这个错误,花了一天的时间没有搞定。

    API对象与平台之间的通讯标准中并没有规定,这张图中采用了Webservice技术来实现通讯,数据的形式就采用了XML标准格式。
     
    展开全文
  • 在本文中,我们将解释什么是交互设计,一些有用的交互设计模型,并简要描述通常交互设计师做什么。 对交互设计通俗易懂的理解 “交互设计”通俗易懂地来讲就是:它是用户和产品之间交互的设计。 大多数情况下,当...

    交互设计是用户体验(UX)设计的一个重要组成部分。在本文中,我们将解释什么是交互设计,一些有用的交互设计模型,并简要描述通常交互设计师做什么。

    对交互设计通俗易懂的理解

    “交互设计”通俗易懂地来讲就是:它是用户和产品之间交互的设计。 大多数情况下,当人们谈论交互设计时,往往是说应用程序或网站等软件产品。交互设计的目标是做出能使用户能以最佳方式实现其目标的产品。

    如果你觉得这个定义听起来很“宽”,那是因为这个领域确实相当广泛:用户和产品之间的互动往往涉及美学,动作,声音,空间等元素。当然,每个元素都可能涉及更专业的领域,例如有关用户交互中声音的声音设计。

    你可能已经意识到,交互设计和用户体验设计有很大的重叠之处。毕竟,用户体验设计是塑造产品使用体验,而大部分体验都会涉及用户和产品之间的一些交互。但用户体验设计不仅仅是交互设计:它还涉及用户研究(首先找出用户是谁)、创建用户画像(为什么,在什么条件下,他们会使用产品),执行用户测试和可用性测试等。

    交互设计的五个维度

    交互设计的5个维度(1)是理解交互设计的有用模型。交互设计学者Gillian Crampton Smith首次提出了交互设计语言“四维“的概念,而 IDEXX 实验室高级交互设计师 Kevin Silver 补充了第五个维度的概念。

    第一维:文案

    文案(尤其是交互中使用的文本,如按钮上的文本)应该有意义且易于理解。他们应该向用户传达信息,但也不能用过多的信息淹没用户的认知。

    第二维:视觉表达

    它涉及到用户与之交互的图形元素,如图像、字体和图标。这些和文本信息相配合,补充性地向用户传达信息。

    第三维:实体以及空间

    用户通过什么实体与产品进行交互?一台笔记本电脑,是带鼠标还是触摸板?还是触屏的智能手机?用户在什么样的物理空间内这样做?例如,用户是站在拥挤的火车上,同时在智能手机上使用应用程序,还是坐在办公室的桌面上浏览网站?这些都会影响用户和产品之间的交互。

    第四维:时间

    虽然这个维度听起来有点抽象,但它主要指的是随时间变化的媒体(动画,视频,声音)。动作和声音在向用户的交互提供视觉和语音的反馈方面起着至关重要的作用。同样值得关注的是用户花费在与产品交互上的时间:用户能不能了解他们的进度,或是否能在一段时间之后继续他们的交互?

    第五维:行为

    这包括产品的机制:用户如何在网站上执行操作?用户如何操作产品?换句话说,它体现了前面的维度是如何定义产品交互的。它还包括“反应“ —— 例如用户对产品的情绪反应或反馈。

    交互设计师提出的重要问题

    交互设计师如何使用上面的5个维度来创建有意义的交互?为了理解这一点,我们可以看看交互设计师在为用户设计时提出的一些重要问题,以下问题由 usabability.gov 提供:

    • 通过鼠标、手指或手写笔,用户可以怎样与界面直接交互?这有助于我们定义用户与产品可能进行的交互。
    • 外观(颜色、形状、尺寸等)是如何表达功能的?这有助于我们告知用户可能的操作有哪些。
    • 如果出现错误,产品提供的反馈是否能让用户纠正问题,或解释错误发生的原因? 这使我们能够预测和减少错误。
    • 执行操作后,用户会得到什么反馈?这使我们能够确保系统在用户操作之后的合理时间内提供反馈。
    • 界面里的元素尺寸大小是否能让用户方便地交互?这种问题能让我们策略性地思考界面里的元素。
    • 是否使用了熟悉或标准样式?标准元素和格式可以简化和增强产品的可学习性。

    那么,交互设计师是做什么的呢?

    嗯,这要视情况而定。

    例如,如果公司足够大,并且拥有巨大的资源,它可能会为UX设计师和交互设计师提供单独的工作。例如,在大型设计团队中,可能有一个 UX 研究员、一个信息架构师、一个交互设计师和一个视觉设计师。但对于较小的公司和团队来说,大多数 UX 设计工作可能由 1-2 人完成,他们可能有也可能没有"交互设计师"的称号。无论如何,以下是交互设计人员在其日常工作中处理的一些任务:

    设计策略

    这涉及到用户的目标是什么,以及实现这些目标所需的交互。根据公司的不同,交互设计师可能必须进行用户研究,找出用户的目标是什么,然后再制定策略将其转化为交互。

    线框和原型

    这同样取决于公司的工作描述,但大多数交互设计师的任务是创建线框图,展示产品中的交互。有时,交互设计师也可能创建可交互的原型和/或高保真原型,看起来与实际的应用程序或网站完全一样。可交互的高保真原型现在都可以使用一些在线原型工具实现,比如国内的墨刀,国外的Axure。

    本文转载自由墨刀翻译自 TEO SIANG 的What is Interaction Design?

    展开全文
  • CEF3和本地程序交互机制

    万次阅读 2014-12-02 20:34:34
    CEF中一个页面的框架如下图所示:     ... CefFrame:每一个页面都由至少一个frame组成,最顶层的为mainframe ...context:JS执行环境,每个frame都有自己独立的context,CEF中使用V8JavaScriptEngine解析和执行JS...
  •  这是一次内部分享,新部门的同学们希望我聊聊我过去从事的交互设计,做个了面对入门者等级的PPT,和各位简单聊了聊。发到微博上,也敦促自己对... 要谈什么是交互设计,先要了解这几个概念。  网页设计年代,
  • Android源码分析-Alarm机制与Binder的交互

    万次阅读 多人点赞 2014-01-19 00:56:53
    前言本次给大家分析的是Android中Alarm的机制以及它和Binder的交互,所用源码为最新的Android4.4。因为Alarm的功能都是通过Binder来完成的,所以,介绍Alarm之前必须要先介绍下它是如何调用Binder来完成定时功能的。...
  • SIP交互流程及路由机制

    千次阅读 2017-08-23 15:23:10
    Dialog是SIP中的一个关键概念。根据RFC3261,会话是两个UA之间持续一段时间的点到点的SIP连接,即是记录两者已经连接上的相关内容实体,方便在对话中请求进行识别和处理。  对话都是有对话ID来标识的,包括Call-ID...
  • qt下qml和c++交互信号槽机制测试

    万次阅读 多人点赞 2014-01-24 16:29:21
    qt下qml和c++信号槽机制测试 本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明. 环境: 主机:WIN7 开发环境:Qt5.2 说明: 写一个测试程序测试qml和c++利用信号槽机制传输信息. 测试程序...
  • 以下几篇文章是较深入分析binder机制。 目录 1. Android - Binder机制 - ServiceManager ...2. Android - Binder机制 - 普通service注册 ...4. Android - Binder机制 - client和普通service交互 5. Android
  • VTK交互交互样式

    千次阅读 2017-05-29 13:45:10
    VTK交互样式 类vtkRenderWindowInteractor即渲染窗口交互器,提供了一种平台独立的响应鼠标/按键/时钟事件的交互机制,可将平台相关的鼠标/按键/时钟等信息路由至vtkInteractorObserver或其子类。 ...
  • Android:你要的WebView与 JS 交互方式 都在这里了

    万次阅读 多人点赞 2017-03-22 09:19:45
    上述功能是由Android的WebView实现的,其中涉及到Android客户端与Web网页交互的实现 今天我将全面介绍Android通过WebView与JS交互的全面方式 阅读本文前请先阅读:Android开发:最全面、最易懂的Webview详解 ...
  • DirectShow通过事件通知(Event Notifation)机制使应用程序与Filter Graph Manager之间实现交互控制。当filter状态转换、播放完成、出错或者重绘视频窗口等时刻会发出特定事件消息,又filter graph manager处理或者...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 505,558
精华内容 202,223
关键字:

交互机制是什么