图像采集回调函数中SendMessage问题?

gxxtjy 2016-02-29 10:17:24
手头上有一个工业相机,正在利用其SDK包二次开发,我是准备在图像采集回调函数中显示图像,回调函数代码如下:
int __stdcall StreamCB(MV_IMAGE_INFO *pInfo,long nUserVal)
{
CMVGigeDlg *pDlg = (CMVGigeDlg *)nUserVal;
//pDlg->p1=pInfo;
return pDlg->DisImage(pInfo);
//return ::SendMessage(pDlg->m_hWnd,WM_SNAP_CHANGE,0,0);

}
int CMVGigeDlg::DisImage(MV_IMAGE_INFO* pInfo)
{//ImgdataVar.parray->pvData=disbuffer;
ImgdataVar.parray->pvData=(WORD*)pInfo->pImageBuffer;
Image1.ArrayToImage(ImgdataVar);
//long imgsize=pInfo->nImageSizeAcq;
//C_CWIMAQImage Imagetemp=m_vision.CreateCWIMAQImage();
return 1;
}

其中StreamCB为全局函数,上述的代码显示图像没有问题,本来是想在回调函数中对图像做些处理的,如果在DisImage return之前调用了C_CWIMAQImage Imagetemp=m_vision.CreateCWIMAQImage();程序运行时会提示RunTime Error!!m_vision.CreateCWIMAQImage()中m_vision是NI的一个图像处理控件
后来我把回调函数改成了发送消息的方式,新的代码如下:

int __stdcall StreamCB(MV_IMAGE_INFO *pInfo,long nUserVal)
{
CMVGigeDlg *pDlg = (CMVGigeDlg *)nUserVal;
pDlg->p1=pInfo;
//return pDlg->DisImage(pInfo);
return ::SendMessage(pDlg->m_hWnd,WM_SNAP_CHANGE,0,0);
}
LRESULT CMVGigeDlg::OnSnapChange(WPARAM wParam,LPARAM lParam)
{ImgdataVar.parray->pvData=(WORD*)p1->pImageBuffer;
Image1.ArrayToImage(ImgdataVar);
C_CWIMAQImage Imagetemp=m_vision.CreateCWIMAQImage();
return 1;
}

程序可以正常运行,我现在也不太清除问题出在哪,为什么发送消息的方式可以实现,这跟回调函数对UI界面的操作有没有什么关系,请大家发表下看法,谢谢了
...全文
208 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
shenyi0106 2016-03-01
  • 打赏
  • 举报
回复
windows的线程分为UI线程和工作者线程。工作者线程中不能直接操作UI控件(MFC封装的UI控件类,有的是可以直接操作的,但是绝大部分操作是不行的),你需要让主线程(也就是UI线程)来替你完成你所需要的操作
ArthurKingYs 2016-03-01
  • 打赏
  • 举报
回复
SendMessage第一个参数句柄可能有问题

15,978

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧