<< 点击显示目录 >> 主页 PVI通信 > PVI帮助信息 > PVI base system > PVICOM interface > User messages > Asynchronous callback |
这个用户消息变体已经过时,被用户消息类型 PVIFUNCTION所取代 。
需要为 用户消息的消息句柄指定一个由应用程序提供的回调函数 的指针。
SET_PVICALLBACK_ASYNC(二进制0xfffffffd)必须被指定为消息编号。消息参数被传递到回调函数中。
PVICALLBACK_ASYNC类型的异步回调函数的语法对应于PVICALLBACK类型的回调函数(用户消息作为没有数据的回调函数)。
与其他回调函数的变体不同,这个变体不是从内部窗口程序调用,而是直接从通信实例的PVICOM线程调用。这意味着回调函数的调用总是异步地发生在用户线程上。因此,应用程序本身必须提供相应的同步机制。回调函数必须保持非常短,因为数据传输(以及因此对PVICOM通信实例的生命符号监测)在执行期间完全被阻断。只有相应的PVICOM响应函数可以在回调函数中被调用。然而,最好将回调参数(wParam和IParam参数)保存在一个单独的列表中,并在一个单独的线程中评估用户信息。在任何情况下都不能在回调函数中调用PviInitialize、PviDeinitialize或任何其他同步的PVICOM函数。
这种回调函数的变体不适合Visual Basic应用程序。
Visual C++的例子
#include <PviCom.h>
HANDLE hPviEvent;
bool bPviExit;
static void WINAPI PviCallback (WPARAM wParam, LPARAM lParam)
{
Container.AddMsg (wParam, lParam);
SetEvent (hPviEvent);
}
void CPviThread::PviExit ()
{
bPviExit = TRUE;
SetEvent (hPviEvent);
}
void CPviThread::PviProc (WPARAM wParam, LPARAM lParam)
{
T_RESPONSE_INFO Info;
long ErrCode;
ErrCode = PviGetResponseInfo (wParam, NULL, NULL, &Info, sizeof(Info));
if (ErrCode != 0)
return; // -> no response (skip error 12055)
switch (Info.nMode)
{
case POBJ_MODE_WRITE:
ErrCode = PviWriteResponse (wParam);
...
}
}
void CPviThread::ThreadFunc ()
{
...
hPviEvent = CreateEvent (NULL, FALSE, FALSE, NULL);
bPviExit = FALSE;
ErrCode = PviInitialize (6, 0, NULL, NULL);
...
while (! bPviExit)
{
LPARAM lParam;
WPARAM wParam;
WaitForSingleObject (hPviEvent, INFINITE);
while (Container.RemoveMsg (&wParam, &lParam))
CPviThread::PviProc (wParam, lParam);
}
...
PviDeinitialize ();
CloseHandle (hPviEvent);
}
这个例子显示了使用PVICALLBACK_ASYNC类型的回调函数的推荐程序。PVICOM函数的调用是在用户线程的上下文中进行的。只有消息参数(wParam, IParam)被存储在异步PVI回调函数的容器中。