LabWindowsCVI 程序 回调函数设计

上传人:m**** 文档编号:486535883 上传时间:2023-08-21 格式:DOC 页数:14 大小:51.50KB
返回 下载 相关 举报
LabWindowsCVI 程序 回调函数设计_第1页
第1页 / 共14页
LabWindowsCVI 程序 回调函数设计_第2页
第2页 / 共14页
LabWindowsCVI 程序 回调函数设计_第3页
第3页 / 共14页
LabWindowsCVI 程序 回调函数设计_第4页
第4页 / 共14页
LabWindowsCVI 程序 回调函数设计_第5页
第5页 / 共14页
点击查看更多>>
资源描述

《LabWindowsCVI 程序 回调函数设计》由会员分享,可在线阅读,更多相关《LabWindowsCVI 程序 回调函数设计(14页珍藏版)》请在金锄头文库上搜索。

1、LabWindows/CVI 程序 回调函数设计1.1 回调函数1.1.1 回调函数设计方法在LabWindows/CVI 程序设计系统中,一个程序可分为若干个程序模块,每个模块用来实现一个特定的功能,这些模块可以是子程序也可以是回调函数。一个LabWindows/CVI 应用程序由一个主函数和若干个其他函数构成,由主函数调用其他函数,其他函数之间也可互相调用,并且可以将一些常用的功能编写成函数形式,供其他模块调用,以提高代码利用率,减少程序编写的工作量。实际上,主程序为用户功能逻辑的入口点,任何一个C 语言程序都需要通过主函数进入该程序的消息循环。回调函数是系统框架设计中非常重要的一种手段,

2、所谓回调函数(callback )是指一个通过函数指针调用的函数。回调函数可由用户设计并被系统所调用,主要用于截获消息、获取系统信息或处理异常事件。回调函数必须遵守事先规定好的参数格式和传递方式,否则会引起程序或系统的崩溃。在使用LabWindows/CVI 进行程序设计时,用框架确定主要的处理流程,而将某些具体的实现交给用户来做。使用回调函数实际上就是在调用某个函数时,将一个函数(这个函数为回调函数)的地址作为参数传递给另一个函数。而另一个函数在需要时,利用传递的地址调用回调函数来处理消息或完成一定的操作。如C 函数库中的qsort 函数,它可以接收一个函数指针做参数来确定排序的策略,用到的

3、就是回调函数的方法。又如,当用Windows 进行系统消息处理时,如果用户注册了回调函数,系统中该消息触发时会调用这个回调函数,使用户逻辑得以执行。在LabWindows/CVI 中,采用回调函数形式响应系统消息循环。回调函数能响应产生于用户界面库(User Interface Library )的所有事件,其回调函数原型定义存储于userint.h 头文件中。面板、菜单、控件等都可安装回调函数,对于特定的接口对象,LabWindows/CVI 会分配适合的回调函数以使程序正常运行。包括系统空闲(Idle)事件和任务结束(end-task)事件都可以通过主回调函数得到响应与执行。在LabWin

4、dows/CVI 系统中,一些事件通过GUI 界面产生并传递给回调函数。如回调函数接收到用户界面的鼠标点击(EVENT_LEFT_CLICK )事件,连同一些相关信息可被记录下来,包括回调函数中鼠标的X轴(eventData2)、Y轴(eventData1 )坐标,面板(panel)、控件(control)信息,并可以通过回调数据(callback data )传递用户自定义数据。LabWindows/CVI 中的回调函数宏定义为CVICALLBACK 存储于cvidefs.h 头文件中,其定义为:#define CVICDECL _cdecl#define CVICALLBACK CVICD

5、ECLCVICALLBACK 常被用来定义函数指针,如:typedef void (CVICALLBACK * MenuDimmerCallbackPtr)(int menuBar, int panel);值得注意的是,CVICALLBACK 宏定义在进行编译时优先于函数,以保证任何用户界面库函数以cdecl 方式被编译,即使stdcall 调用约定下也是如此。在LabWindows/CVI 中,由五类对象可通过事件触发回调函数,即控件触发、面板触发、菜单触发、定时器触发和主回调函数触发,回调函数触发优先级定义如下。控件触发优先级:控件回调函数面板回调函数(键盘和鼠标事件)主回调函数面板触发优

6、先级:面板回调函数主回调函数菜单触发优先级:菜单项回调函数主回调函数定时器触发优先级:控件回调函数主回调函数触发优先级:主回调函数值得注意的是,EVENT_COMMIT 事件是存放在用户事件队列中的,通过GetUserEvent 函数传递给所有回调函数。1.1.2 回调函数程序设计(1)面板设计编写一个伪随机信号发生器程序,并将产生的数据在Graph 控件中显示出来,将生成程序的文件名在String 控件中显示。为了使整个面板居中显示,双击面板调出Edit Panel 对话框,选择Auto-Center VerTIcally (when loaded) 和Auto-Center horizon

7、tally (when loaded),并点击Other Attributes按钮,选择Movable 、Can Minimize 、TItle Bar Visible 、Use Windows Visual Styles for Controls 项。面板设计如图1-1 所示,面板中主要控件属性设置如表1-1 所示。图1-1 回调函数面板表1-1 控件属性设置表(2)程序源代码/头文件声明,系统自动添加#include ansi_c.h#include cvirte.h#include userint.h#include 回调函数.h/全局静态变量staTIc int panelHandle

8、;/主函数int main (int argc, char *argv)/初始化LabWindows/CVI 运行时库引擎if (InitCVIRTE (0, argv, 0) = 0)/如果返回值为0, 则初始化失败,返回1return 1;/装载面板,返回面板句柄if (panelHandle = LoadPanel (0, 回调函数.uir, PANEL) 0)/如果装载面板失败,则返回1return 1;/获得*argv 中的字符串,即为文件名SetCtrlVal (panelHandle, PANEL_STRING, argv0);/显示面板DisplayPanel (panelHa

9、ndle);/运行用户界面RunUserInterface ();/删除面板句柄DiscardPanel (panelHandle);/主函数执行成功,返回0return 0;/面板回调函数int CVICALLBACK PanelCB (int panel, int event, void *callbackData,int eventData1, int eventData2)switch (event)/面板响应事件case EVENT_CLOSE:/ 调用退出按钮的EVENT_COMMIT 事件QuitCallback (panelHandle, PANEL_QUITBUTTON, E

10、VENT_COMMIT, 0, 0, 0);break;/函数返回值,0 表示成功return 0;/退出按钮int CVICALLBACK QuitCallback (int panel, int control, int event,void *callbackData, int eventData1, int eventData2)if (event = EVENT_COMMIT)/退出用户界面QuitUserInterface (0);return 0;/显示按钮int CVICALLBACK OkCallback (int panel, int control, int event,

11、void *callbackData, int eventData1, int eventData2)/定义局部变量int i;double datapoints100;switch (event)case EVENT_COMMIT:/ 产生100 个随机数,放入数组datapoints 中for (i = 0; i 100; i+)datapointsi = rand() / 32767.0 * 100.0;/ 清除以前Graph 中绘制的波形DeleteGraphPlot (panelHandle, PANEL_GRAPH, -1, VAL_IMMEDIATE_DRAW);/ 在Graph

12、 中绘制波形PlotY (panelHandle, PANEL_GRAPH, datapoints, 100, VAL_DOUBLE, VAL_THIN_LINE,VAL_EMPTY_SQUARE, VAL_SOLID, 1, VAL_RED);break;return 0;3:程序注释 main 函数每一个C 程序都必须从一个main 函数开始,在调用其他函数流程后再次回到main 函数,并且在main 函数中结束整个程序的运行。实际上,main 函数可以放在程序的任何地方:有些程序员喜欢把它放在最前面,而另一些程序员把它放在最后面,无论放在哪个地方,以下几点说明都是适合的。在C语言中,ma

13、in 函数可以有三个参数,即:argc,argv 和env 。argc :整数类型,表示传给main 函数的命令行参数个数,一般为1。*argv :二维字符串数组。在LabWindows/CVI 中,argv0 为程序运行时的文件名,与编译设置有关,在菜单BuildConfiguraTIon 下有两个选项,即:Release 和Debug。当选择Release 时,argv0 为当前工程名加上.exe;当选择Debug 时,argv0 为当前工程名加上_dbg.exe。argvargc 为NULL 。*env:二维字符串数组,为环境变量。在LabWindows/CVI 中,env一般为空字符串

14、且省略不写。LabWindows/CVI 启动时总是把这三个参数传递给main 函数,参数的传递顺序为:argc 、argv 、env,可以在用户程序中加以说明也可以不说明,如果说明了部分或全部参数,它们就成为main 主函数的局部变量。main 主函数的声明方式主要有以下几种:main (void)main (int argc, char *argv)main (int argc, char *argv, char *env) InitCVIRTE 函数初始化LabWindows/CVI 运行时(库)引擎。在使用外部编译器Visual C+ 、Borland C+ Builder 时调用,如

15、果不使用外部编译器,不会影响程序正常运行。函数原型为:int InitCVIRTE (void *HInstance, char *Argv, void *Reserved);*HInstance:对于main 函数应为0;对于WinMain 函数应为hInstance ;对于DllMain 应为hInstDLL。*Argv :对应于main 函数的*argv 参数。*Reserved:保留参数,设置为0。一般在使用main 函数、WinMain 函数、DllMain 函数时,InitCVIRTE 函数的参数设置稍有不同,其具体调用方式如下所示:main 函数int main (int argc, char *argv)if (InitCVIRTE (0, argv, 0) = 0)return 1; /* out of memory */ /用户程序return 0; WinMain 函数in

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 医学/心理学 > 基础医学

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号