自学内容网 自学内容网

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),以免造成内存泄漏。


原文地址:https://blog.csdn.net/zhutianyu_123/article/details/143748859

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!