CVI的工作流程是基于事件的,用户动作产生事件,然后对事件进行相应的响应。我们来看下面一张图(该图源于CVI的帮助文档):
左边的大方框为面板以及面板上各类控件的表示,右边的Source(.c)File里面有4个函数,下面三个是回调函数,也就是我们在编辑面板以及控件的属性时,给它们分配的回调函数。
直观来讲,当用户有了操作, CVI就会进行相应的响应并产生事件,然后根据事件调用回调函数,并执行回调函数中的用户代码。
右边最上面一个是main函数,CVI程序启动时,首先执行的是main函数。在main函数中进行必要的初始化,然后进入到事件循环中。在事件循环中,CVI不断的获取事件,然后根据事件进行相应的处理。
看看下面一张图(来自CVI的帮助文档):
注意到左边是面板,用来和用户进行交互,将用户的操作转换成相应的事件,并放到事件队列中。然后在事件循环中使用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函数。
文章评论(0条评论)
登录后参与讨论