<< 点击显示目录 >> 主页 PVI通信 > PVI帮助信息 > PVI base system > PVICOM interface > User messages > Callback with data |
需要为 用户消息的消息句柄指定一个由应用程序提供的回调函数 的指针。
SET_PVICALLBACK_DATA(二进制0xfffffe)必须被指定为消息编号。消息参数被传递到回调函数中。
void WINAPI PviProc (WPARAM wParam, LPARAM lParam, LPVOID pData, DWORD DataLen, T_RESPONSE_INFO* pInfo)
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);
...
}