上传者: 26731219
|
上传时间: 2022-03-30 16:53:56
|
文件大小: 4.98MB
|
文件类型: -
虚拟仪器软件开发环境——LabWindows/CVI 6.0 编程指南
259
void *callbackData, unsigned int threadID)
{
char *str = *(char **)threadLocalPtr;
free (str);
}
一些被分配的资源必须在分配它们的线程中释放,这些资源被称为具有线程亲缘。例
如,一个面板必须在创建它的线程中释放。当调用CmtDiscardThreadLocalVar的时候,实用
库在调用它的线程中调用线程局部变量的释放函数,并在每一个访问这个变量的线程中调
用一次这个函数。在释放回调函数的threadID参数中,把需要调用释放回调函数线程的线
程ID传递给它,用这个线程ID确定是否可以直接释放具有线程亲缘的资源,或者是否需要
调用toolslib.fp中的PostDeferredCallToThreadAndWait函数在正确的线程中释放。下面的代
码说明如何改变上面的程序在分配字符串的线程中释放它们:
void CVICALLBACK StringDiscard (void *threadLocalPtr, int event,
void *callbackData, unsigned int threadID)
{
char *str = *(char **)threadLocalPtr;
if (threadID == CmtGetCurrentThreadID ())
free (str);
else
PostDeferredCallToThreadAndWait (free, str, threadID,
POST_CALL_WAIT_TIMEOUT_INFINITE);
}
LabWindows/CVI中samples\utility\threading\threadlocalvar\threadlocalvar.prj例程演示了
如何在LabWindows/CVI中使用线程局部变量。
7.2.8 其它一些要注意的问题
一、消息处理
每一个创建窗口的线程必须处理Windows消息以避免造成系统锁死。用户界面库函数
RunUserInterface包含了一个处理LabWindows/CVI用户界面事件和处理Windows消息的循
环,用户界面库函数GetUserEvent和ProcessSystemEvents在每一次调用它们的时候处理
Windows消息。在下面情况有一个发生的时候,程序中的每一个线程必须定期调用
GetUserEvent或ProcessSystemEvents来处理Windows消息:
线程创建了一个窗口但是没有调用RunUserInterface
线程创建了一个窗口而且调用了RunUserInterface,但是执行回调函数需要相当长
的时间才能返回到RunUserInterface循环(超过几百微秒)。
另外,可以在程序中不能正确处理Windows消息的地方加入这些函数。当在
LabWindows/CVI用户界面线程调用GetUserEvent,ProcessSystemEvents或RunUserInterface