- 易迪拓培训,专注于微波、射频、天线设计工程师的培养
LabWindows/CVI虚拟仪器设计技术场景与游戏设计之: 下雪场景
(3)程序注释
① NewAsyncTimer 函数
创建一个异步定时器并返回异步定时器ID。创建的异步定时器会自动开辟一个新的线程,其默认优先级为THREAD_PRIORITY_HIGHEST ,如需要修改优先级,可调用NewAsyncTimer WithPriority 函数重新设置优先级,异步定时器支持Windows 、real-time (RT) 、Linux 等系统。函数原型为:
int NewAsyncTimer (double Interval, int Count, int Initial_State, void *Event_Function, void *Callback_Data);
Interval:指定触发事件时间间隔,以秒计。
Count :指定异步定时器触发的事件数目。如果输入负值,则异步定时器只有调用DiscardAsyncTimer 或SuspendAsyncTimerCallbacks 函数时才会被终止。如果输入0 则返回一个错误。
Initial_State :设置异步定时器为运行或暂停状态。可以通过SetAsyncTimerAttribute 函数重新设置状态。
*Callback_Data :用户定义回调数据。
返回值:返回异步定时器ID。负值表示产生错误。错误说明如表4-6 所示。
表4-6 异步定时器错误说明表
错误码 | 说明 | |
–1 | 系统分配异步定时器资源失败 | |
–2 | 没有ID 资源分配给异步定时器 | |
–3 | 内存不足 | |
–4 | 指定ID 不存在 | |
–5 | 调用并初始化异步定时器未完成 | |
–6 | 内部错误 | |
–7 | 参数传递无效 | |
–8 | 仅用于实时系统 | |
–9 | 不能设置此属性 |
*Event_Function :指定用户自定义异步定时器函数名。此参数为AsyncTimerCallbackPtr 函数指针类型,函数定义与普通定时器类似,即:
int CVICALLBACK FunctionName (int reserved, int timerId, int event, void *callbackData, int eventData1, int eventData2);
reserved :保留参数。
timerId :异步定时器ID,用于产生回调事件。
event:响应事件,包含EVENT_TIMER_TICK 和EVENT_DISCARD 事件。
*callbackData :用户定义回调数据。
eventData1 :为双精度指针变量,指向异步定时器持续运行时间。
eventData2 :为双精度指针变量,指向异步定时器从上次触发事件到该时间持续时间。
② DiscardAsyncTimer 函数释放异步定时器资源。函数原型为:
int DiscardAsyncTimer (int Timer_ID);
Timer_ID :异步定时器ID。如果输入值为–1,将释放所有异步定时器资源。注意,创建或释放异步定时器只有当函数执行完毕返回时才能真正完成,否则会有错误产生。
③ SuspendAsyncTimerCallbacks 函数停止所有异步定时器,直到调用ResumeAsyncTimerCallbacks 函数。函数原型为:
int SuspendAsyncTimerCallbacks (void);
④ Delay 函数延时指定时间,以秒计。一般情况下,默认分辨率为1ms 。函数原型为:
void Delay (double Number_of_Seconds);
Number_of_Seconds :延时时间。
⑤ CanvasDrawPoint 函数在Canvas 控件上绘制点图。绘制时使用ATTR_PEN_COLOR 、ATTR_PEN_MODE 和ATTR_PEN_WIDTH 属性。当ATTR_PEN_WIDTH 属性不为1 时,可能出现非圆形点。函数原型为:
int CanvasDrawPoint (int Panel_Handle, int Control_ID, Point Point);
⑥ MakeColor 函数利用红、绿、蓝三色合成一个RGB 颜色值。RGB 值是一个4 字节整型数据,用十六进制表示为0x00RRGGBB,RR、GG、BB 分别表示红、绿、蓝三基色。函数原型为:int MakeColor (int Red, int Green, int Blue);
Red:红色分量值,取值范围为0~255 。
Green:绿色分量值,取值范围为0~255 。Blue:蓝色分量值,取值范围为0~255 。
⑦ DisableBreakOnLibraryErrors 函数
当产生库函数错误时,禁止弹出运行时错误对话框。可以使用SetBreakOnLibraryErrors 函数代替。函数原型为:
void DisableBreakOnLibraryErrors (void);
通常情况下,可以通过选择菜单Run→Break on→Library Errors 选择打开或关闭运行时错误对话框。如果需要打开运行时错误对话框,也可采用EnableBreakOnLibraryErrors 或SetBreakOnLibraryErrors 函数。
⑧ 异步定时器退出问题
如果将面板回调函数PanelCB 中的SuspendAsyncTimerCallbacks 和Delay 函数删除,在关闭面板时,会弹出运行时错误对话框,如图4-8 所示。从提示内容可以看出,此错误为"NON-FATAL RUN-TIME ERROR",即非致命运行时错误,并给出错误线程ID。由于异步定时器与用户界面逻辑分布在不同的线程中,会造成主函数main 中的DiscardPanel 已经执行完毕,panelHandle 句柄已经释放,但异步定时器可能只运行了一半,由于异步定时器的特殊性决定了其必须运行完毕才能暂停或终止,因此,错误提示中会出现句柄无效的情况。简单的做法是在timer 回调函数的首行添加DisableBreakOnLibraryErrors 函数,禁止错误对话框弹出。如果想根除错误,需要在面板回调函数PanelCB 首先停止异步定时器并等待其执行完毕,即延时一定时间,如一个Interval 来使另一个线程中的timer 函数执行完毕并成功返回。
上一篇:LabWindows/CVI虚拟仪器设计技术场景与游戏设计之:
打蜜蜂
下一篇:LabWindows/CVI虚拟仪器设计技术场景与游戏设计之:时钟制作