原创 CVI的事件机制与回调函数

2011-3-27 13:38 8331 4 4 分类: 软件与OS

 


CVI的工作流程是基于事件的,用户动作产生事件,然后对事件进行相应的响应。我们来看下面一张图(该图源于CVI的帮助文档):


e10435c5-5a5c-4f68-97cf-1546cf9d7a88.jpg



左边的大方框为面板以及面板上各类控件的表示,右边的Source(.c)File里面有4个函数,下面三个是回调函数,也就是我们在编辑面板以及控件的属性时,给它们分配的回调函数。


 


直观来讲,当用户有了操作, CVI就会进行相应的响应并产生事件,然后根据事件调用回调函数,并执行回调函数中的用户代码。


 


右边最上面一个是main函数,CVI程序启动时,首先执行的是main函数。在main函数中进行必要的初始化,然后进入到事件循环中。在事件循环中,CVI不断的获取事件,然后根据事件进行相应的处理。


 


看看下面一张图(来自CVI的帮助文档):


e120fd9a-3b60-4a0a-a86e-33a7b5f5a535.jpg



注意到左边是面板,用来和用户进行交互,将用户的操作转换成相应的事件,并放到事件队列中。然后在事件循环中使用GetUserEvent()函数来获取事件,并调用相应的回调函数进行处理。


 


可以看到,面板只负责和用户交互,将用户的操作转换成事件,然后事件循环负责监控事件并将事件分派给相应的回调函数,而回调函数一般都由用户自行编写,以实现所需的功能。


 


在我们的第一个实例中,main函数中的代码如下:


int main (int argc, char *argv[])


{


         if (InitCVIRTE (0, argv, 0) == 0)


                   return -1; /* out of memory */


         if ((panelHandle = LoadPanel (0, "CTITest.uir", PANEL)) < 0)


                   return -1;


         DisplayPanel (panelHandle);


         RunUserInterface ();


         DiscardPanel (panelHandle);


         return 0;


}


 


注意到第5行中的LoadPanel函数,该函数将用户画好的面板装载到内在中,然后在第7行用DisplayPanel函数将它显示出来。这一切做好之后,就调用RunUserInterface函数了。这个函数是不会返回的,它里面实现了事件循环,即不断的获取事件、分派事件。


 


当然,用户有需要可以自行编写事件循环,自己处理事件以及分派工作。如果用户想自行编写,那么调用GetUserEvent函数。


 


 

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
4
关闭 站长推荐上一条 /3 下一条