好文档 - 专业文书写作范文服务资料分享网站

LabWindows-CVI 程序 回调函数设计

天下 分享 时间: 加入收藏 我要投稿 点赞

LabWindows/CVI 程序 回调函数设计

1.1 回调函数1.1.1 回调函数设计方法

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

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

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

在LabWindows/CVI 系统中,一些事件通过GUI 界面产生并传递给回调函数。如回调函数接收到用户界面的鼠标点击(EVENT_LEFT_CLICK )事件,连同一些相关信息可被记

录下来,包括回调函数中鼠标的X轴(eventData2)、Y轴(eventData1 )坐标,面板(panel)、控件(control)信息,并可以通过回调数据(callback data )传递用户自定义数据。 LabWindows/CVI 中的回调函数宏定义为CVICALLBACK 存储于cvidefs.h 头文件中,其定义为:#define CVICDECL __cdecl #define CVICALLBACK CVICDECL CVICALLBACK 常被用来定义函数指针,

如:typedef void (CVICALLBACK * MenuDimmerCallbackPtr)(int menuBar, int panel); 值得注意的是,CVICALLBACK 宏定义在进行编译时优先于函数,以保证任何用户界面库函

数以cdecl 方式被编译,即使stdcall 调用约定下也是如此。

在LabWindows/CVI 中,由五类对象可通过事件触发回调函数,即控件触发、面板触发、菜单触发、定时器触发和主回调函数触发,回调函数触发优先级定义如下。 控件触发优先级: ●控件回调函数

●面板回调函数(键盘和鼠标事件) ●主回调函数 面板触发优先级: ●面板回调函数 ●主回调函数 菜单触发优先级: ●菜单项回调函数 ●主回调函数 定时器触发优先级: ●控件回调函数 主回调函数触发优先级:

●主回调函数

值得注意的是,EVENT_COMMIT 事件是存放在用户事件队列中的,通过GetUserEvent 函数

传递给所有回调函数。 1.1.2 回调函数程序设计 (1)面板设计

编写一个伪随机信号发生器程序,并将产生的数据在Graph 控件中显示出来,将生成程序的文件名在String 控件中显示。为了使整个面板居中显示,双击面板调出Edit Panel 对话框,选择Auto-Center VerTIcally (when loaded) 和Auto-Center horizontally (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; //主函数

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

//初始化LabWindows/CVI 运行时库引擎 if (InitCVIRTE (0, argv, 0) == 0) //如果返回值为0, 则初始化失败,返回1 return 1;

//装载面板,返回面板句柄

if ((panelHandle = LoadPanel (0, 回调函数.uir, PANEL)) 《 0) //如果装载面板失败,则返回1 return 1;

//获得*argv[] 中的字符串,即为文件名

SetCtrlVal (panelHandle, PANEL_STRING, argv[0]); //显示面板

DisplayPanel (panelHandle); //运行用户界面 RunUserInterface (); //删除面板句柄

DiscardPanel (panelHandle); //主函数执行成功,返回0 return 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, EVENT_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, void *callbackData, int eventData1, int eventData2) {

//定义局部变量 int i;

double datapoints[100];

LabWindows-CVI 程序 回调函数设计

LabWindows/CVI程序回调函数设计1.1回调函数1.1.1回调函数设计方法在LabWindows/CVI程序设计系统中,一个程序可分为若干个程序模块,每个模块用来实现一个特定的功能,这些模块可以是子程序也可以是回调函数。一个LabWindows/CVI应用程序由一个主函数和若干个其他函数构成,由主函数调用其他函数,其他函数之间也可互相调用
推荐度:
点击下载文档文档为doc格式
58ly93nimp47ty70kclt55mbv23ri50056l
领取福利

微信扫码领取福利

微信扫码分享