第九讲 定时器Timer控件及相关函数

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

表 9-1 主要控件基本属性列表
控件类型 Constant Name
属性设置
面板
PANEL
Panel
命令按钮
பைடு நூலகம்
Callback
QuitCallback
Command Button QUITBUTTON
Function
Lable
__Quit
Callback
DAQControlCB
双态按钮
TOGGLEBUTTO
练习
任务
使用异步定时器编写一个数据采集的多线程程序,和普通定时器比较二者运行时的差
异。
实验步骤
步骤 1:设计程序界面,生成程序框架。
根据实验要求,我们在面板上放置两个带状图控件,分别用于显示异步定时器和普
通定时器的采样结果;放置一双态按钮来控制数据采集的开始和关闭。最终界面如图 9-1
所示,其主要控件的基本属性列表见表 9-1。
if ((panelHandle = LoadPanel (0, "lesson9.uir", PANEL)) < 0) return -1;
DisplayPanel (panelHandle); /*获得异步定时器句柄*/ AsyncTimerID=NewAsyncTimer (1.0, -1, 0, AsyncTimerCB, 0); RunUserInterface ();
void *callbackData, int eventData1, int eventData2) {
switch (event) {
case EVENT_COMMIT: //为面板、控件和菜单安装主回调函数 InstallMainCallback (EventFunction, 0, 1); //设置主回调函数的响应时间 SetIdleEventRate (100); break;
s 为返回值,返回 8 个 ASCII 码字符组成的时间。 ③GetSystemTime 函数:获得系统时间,为数值格式。Windows SDK 中 也 包 含 GetSystemTlme 函数,如果在头文件中包含 windows.h 而没有包含 utility.h,将会产生编译错 误。函数原型为: int GetSystemTime (int *Hours, int *Minutes, int *Seconds); 其中,参数 hours 表示小时(0〜23); minutes 表示分(0〜59); seconds 表示秒(0〜59); 返 回值为 0 时表示成功,为-1 时表示操作系统出错。 ④GetSystemDate 函数:函数的功能是以数字形式得到系统的日期.该函数原形为
Lable
Lable
Lable Lable
DataAquirTimerCB 1.0
普通定时器 异步定时器
TIME DATE
图 9-1 最终用户界面
步骤 2:添加异步定时器。把异步定时器的仪器驱动程序添加到当前工程,在工程窗口 选 择 Edit→Add File To Project→Instrument(*.fp) , 路 径 为 CVI\toolslib\toolbox\asynctmr.fp。
步骤 3:获得异步定时器句柄,在 main 函数添加如下语句: static int AsyncTimerID;/*先声明句柄变量*/ int main (int argc, char *argv[]) {
if (InitCVIRTE (0, argv, 0) == 0) return -1; /* out of memory */
break; } return 0; } /*普通定时器回调函数 DataAquirTimerCB*/ int CVICALLBACK DataAquirTimerCB (int panel, int control, int event, void *callbackData, int eventData1, int eventData2) { double data; switch (event) { case EVENT_TIMER_TICK:
int status = int GetSystemDate (int *Month, int *Day, int *Year); 其中,参数 month 表示月(1〜12); day 表示日期(1〜31); year 表示年;返回值为 0 时 表示成功,为-1 时表示操作系统出错。 ⑤SetSystemTime 函数:设置系统时间。函数原型为: int SetSystemTime (int Hours, int Minutes, int Seconds); 其中,参数 hours 表示小时(0〜23); minutes 表示分(0〜59); seconds 表示秒(0〜59); 返 回值为 0 时表示成功,为-1 时表示操作系统出错。 ⑥SetSystemDate 函数:设置系统日期。函数原型为: int GetSystemDate (int *Month, int *Day,int *Year); 其中,参数 month 表示月(1〜12); day 表示日期(1〜31); year 表示年:返回值为 0 时 表示成功,为-1 时表示操作系统出错。
事件产生的时间进度。用户只能在用户界面编辑窗口中看到该控件(如图 9.1 所示),在程 序运行时该控件不可见。 正因为如此,在程序运行过程中,用户不能用鼠标或是键盘操控 它。
9.1 定时器控件 定时器按照用户设定好的时间间隔,产生 EVENT_TIMER_TICK 事件,随后会执行相 应的回调函数。 定时器有两个重要属性,分别为: • ATTR_ENABLED:定时器是否可以响应控件的回调函数。 • ATTR_INTERVAL:设置定时器执行回调函数的时间间隔。 上面两个重要的属性可以在双击控件所弹出的控件编辑对话框里设置,也可以在源文件 中输入源代码设置该属性。 9.2 定时器相关函数 (1)定时器控件的基本函数定时器控件的基本函数位于:Library—UserInterface Library →Controls/Graphs/Strip Charts—Timers 目录下 。 ①ResetTimer 函数:重新设置定时器在间隔时间内的开始时间(例如:定时器的 ATTR_INTERVAL 时间间隔属性为 10s,如果在 10s 之内调用该函数,则定时器重新从 0s 开始计时,直到第 10s 才执行相应的回调函数)。函数原型为: int ResetTimer (int PanelHandle, int ControlID); ②SuspendTimerCallbacks 函数:停止所有的定时器回调函数执行,但并不改变定时器的 间隔时间 ATTR_INTERVAL 属性。函数原型为: int SuspendTimerCallbacks (void); ③ResumeTimerCallbacks 函数:重新开始执行被 SuspendTimerCallbacks 函数停止的定 时器回调函数。函数原型为: int ResumeTimerCallbacks (void); (2) Timer 控件回调函数 Timer 控件的回调函数为: int CVICALLBACK Timer (int panel, int control, int event, void *callbackData, int eventDatal, int eventData2) • event:指 EVENT_TIMER_TICK 事件,默认值为 15。 • eventDatal:指向定时器当前时间的指针。 • eventData2:记录定时器最后一次接收 EVENT_TIMER_TICK 事件的时间。 (3)与日期时间相关的函数 ①*DateStr 函数:返回 10 个 ASCII 码字符组成的日期。形式为 MM-DD-YYYY, MM 指月,DD 指日,YYYY 指年份。函数原型为: char *s=DateStr (void); s 为返回值,返回 10 个 ASCII 码字符组成的日期。 ②*TimeStr 函数:返回一个 8 个字符的时间指针。形式为 HH:MM:SS, HH 指 时 , MM 指 分,SS 指秒。函数原型为: char *s=TimeStr (void);
eventFunction:处理的事件函数的名称。事件函数类型 MainCallbackPtr 事件函数接收面板、菜单栏、菜单项和控件 ID 回调函数的信息。事件函数还接收回调 数据和所述事件的类型,例如左击鼠标,以及任何额外的事件数据,如在一鼠标左键时的鼠 标位置。用户回调必须始终返回 0,除非打算结束事件与它们的响应。结束的情况下,回调 应该返回 1。 Callback_Data:void 型,指向定义的数据。回调函数接收的指针。(Points to data that you define. The callback function receives the pointer) int Get_Idle_Events:1=响应空闲事件;0=忽略空闲事件 getIdleEvents 允许执行程序进行时,它通常会被暂停。例如,该程序通常悬浮在 GetUserEvent 或 RunUserInterface 函数当用户按下控件或下拉菜单的鼠标按钮。空闲的事件 不断发生,即使在这种情况下。因为主回调可以接收空闲事件时,程序可以通过响应怠速事 件继续进行处理。调用 SetIdleEventRate 设置空闲事件的发生率。 举例: 在 int CVICALLBACK stripchart (int panel, int control, int event,
DiscardPanel (panelHandle); return 0; } 步骤 4:声明异步定时器回调函数。在 main 函数之前声明。 /*声明 AsyncTimerCB*/ int CVICALLBACK AsyncTimerCB (int reserved, int timerId,
int event, void *callbackData, int eventData1, int eventData2); 步骤 5:编写回调函数。 /*双态按钮回调函数 DAQControlCB*/ int CVICALLBACK DAQControlCB (int panel, int control, int event, void *callbackData, int eventData1, int eventData2) { int i; switch (event) { case EVENT_COMMIT: GetCtrlVal (panelHandle, PANEL_TOGGLEBUTTON, &i); SetCtrlAttribute (panelHandle, PANEL_TIMER, ATTR_ENABLED, i); SetAsyncTimerAttribute (AsyncTimerID, ASYNC_ATTR_ENABLED, i);
第九讲 定时器 Timer 控件及相关函数
9.0 引言 在上一讲的练习中在画随机图形时,需要连续将 Random 的随机数据画出,如果使用 if 循环画出的数据是有限个,循环计数一到就不能再进行下去,因此使用 InstallMainCallback 安装单一的回调函数处理所有事件。这个回调函数是面板,控件,菜单,都可以调用是通用 消息处理函数,事件函数被调用时产生一个事件,其函数原型为: int InstallMainCallback (MainCallbackPtr eventFunction, void *callbackData, int getIdleEvents); 参数:
Function
Toggle Button
N
Initial State
off
Lable
数据
定时器控件 Timer
带状图控件 Strip Chart
string string
TIMER
STRIPCHART STRIPCHART _2 TIME DATE
Callback Function Interval (seconds)
} return 0; } 在 int CVICALLBACK stripchart 中为绘图控件安装主回调函数 另外,用 SetIdleEventRate (100)函数用于设置主回调接收空闲事件之间的间隔。 这是一种定时响应事件的方式。 9.1 定时器控件 使用定时器(Timer)的目的是每隔特定时间间隔触发某一指定事件。由定时器控制这些
相关文档
最新文档