项目是用Qt框架下接收海康工业相机图像并做进一步计算,每台相机建立一个线程类单独处理相机的图像接收和初步处理。相机由外部信号触发拍摄,经函数MV_CC_RegisterImageCallBack注册回调函数方式传回图片。
回调函数MV_CC_RegisterImageCallBack :
MV_CAMCTRL_API int __stdcall MV_CC_RegisterImageCallBack(void* handle,
void(__stdcall* cbOutput)(unsigned char* pData, MV_FRAME_OUT_INFO* pFrameInfo, void* pUser),
void* pUser);
回调函数:void(__stdcall* cbOutput)(unsigned char* pData, MV_FRAME_OUT_INFO* pFrameInfo, void* pUser) 只能是一个static void __stdcall 类型的函数,无法直接与线程类关联,因为是静态函数,也不能访问类成员变量,查看过函数的线程代号,与线程类不在同一个线程,所以图像数据不能直接返回到线程类内。
解决方法:
经void* pUser传递当前线程类的指针,在回调函数中取回。
//注册数据回调函数
nRet = MV_CC_RegisterImageCallBack(mHandle, callback, this); //void* pUser=this
线程类内声明回调函数:
static void __stdcall callback(unsigned char* pData, MV_FRAME_OUT_INFO* pFrameInfo, void* pUser);
this 为当前线程类的指针,
callback函数内部 : classname *p = (classname*) pUser;
然后使用 p->类成员 即可访问线程类的成员,完成诸如图像返回,signal emit 的操作。