Callback with data

<< 点击显示目录 >>

主页  PVI通信 > PVI帮助信息 > PVI base system > PVICOM interface > User messages >

Callback with data

需要为 用户消息的消息句柄指定一个由应用程序提供的回调函数 的指针

SET_PVICALLBACK_DATA(二进制0xfffffe)必须被指定为消息编号。消息参数被传递到回调函数中。

类型为PVICALLBACK_DATA的回调函数的语法。

void WINAPI PviProc (WPARAM wParam, LPARAM lParam, LPVOID pData, DWORD DataLen, T_RESPONSE_INFO* pInfo)

类型为PVICALLBACK_DATA的回调函数的参数。

Argument

说明

wParam

始终为0(保留给未来的扩展)。

lParam

消息参数 在32位PVI版本(PviCom.dll)中,消息参数(用户参数)的大小为4字节,在64位PVI版本(PviCom64.dll)中为8字节。

pData

指向响应或事件数据的指针。如果NULL作为指针被传输,那么就不存在数据。

DataLen

响应或事件数据的长度(字节

pInfo

指向 RESPONSE_INFO结构的指针 ,用于获取额外信息

响应或事件数据被直接传输到回调函数中。调用相应的响应函数是不必要的,甚至是不可能的。

调用回调函数是在PVICOM接口内使用内部窗口的窗口程序处理的。这允许回调函数总是在用户线程的上下文中被调用。如果一个应用程序在不同的线程中使用异步窗口,并且在不止一个线程中使用PVICOM函数,可以确定回调函数当前在哪里(在哪个线程上下文)运行。异步PVICOM函数具有多线程能力。因此,调用这些函数不是问题,相反,它是在访问内部应用程序的数据缓冲区。在这种情况下,应用程序必须配备适当的访问同步机制(例如,关键部分)。

在回调函数中,可以使用不受限制的异步PVICOM函数,但同步PVICOM函数则不能。一般来说,回调函数应该保持简短。可能需要较长时间的操作(如访问数据库等)不应该在这里进行。

Visual C++的例子

#include <PviCom.h>
class CPviDlg : public CDialog
{
    ...
    DWORD m_hPv;
    DWORD m_PvData;
    DWORD m_PvStatus;
    void MakePviReadRequ ();
    void MakePviReadResp (DWORD, DWORD*);
    ...
};
static void WINAPI PviProc (WPARAM wParam, LPARAM lParam,
                            LPVOID pData, DWORD DataLen,
                            T_RESPONSE_INFO* pInfo)
{
    CPviDlg* pPviDlg = (CPviDlg*) lParam;
    if (pInfo->ErrCode == 0) && (DataLen == sizeof(DWORD))
        pPviDlg->MakePviReadResp (pInfo->Status, (DWORD*) pData);
}
void CPviDlg::MakePviReadResp (DWORD Status, DWORD* pData)
{
    m_PvStatus = Status;
    m_PvData = *pData;
}
void CPviDlg::MakePviReadRequ ()
{
    long ErrCode;
    // make read request:
    ErrCode = PviReadRequest (m_hPv, POBJ_ACC_DATA,
                              PviProc, SET_PVICALLBACK_DATA, (LPARAM) this);
    ...
}