Asynchronous callback

<< 点击显示目录 >>

主页  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回调函数的容器中。