win32 / WTL 开发多线程应用,子线程传递大对象给UI线程(主窗口)的方法

这是线程间通信的问题,主要用到的win32 API是:

BOOL PostMessage(
  [in, optional] HWND   hWnd,
  [in]           UINT   Msg,
  [in]           WPARAM wParam,
  [in]           LPARAM lParam
);

但要注意几点问题:

1、该方法每次调用,只能传递两个值:wParam和lParam,这两个值是都是整数,如果要传递大的对象,比如cv::Mat对象,不能直接用这两个值传递,可以传递cv::Mat对象的指针,将指针强制转为WPARAM或LPARAM类型,传递出去,然后在消息处理函数中再强制转为cv::Mat*类型,就可以使用了。

2、这个win32 API 是异步的,如果传递的指针指向的是一个局部变量,比如在 线程函数中声明的cv::Mat对象,这种对象是在栈上的,一旦超出对象的作用域,对象就会自动销毁,不能保证当主窗口收到消息进行处理时,接收到的指针指向的有效性,有可能指向的对象已经销毁了。正确的做法是子线程要new一个cv::Mat对象,传递new出来对象的指针。因为子线程的堆空间(堆栈)是和主线程及整个进程共用的,这样主线程收到指针后就也能拿到指向的对象。

3、主线程(主窗口)中,使用完这个对象后,必须释放(delete),以免造成内存泄漏。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值