当前位置: 首页 > article >正文

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


http://www.kler.cn/a/395158.html

相关文章:

  • 删库跑路,启动!
  • 通过MongoDB Atlas 实现语义搜索与 RAG——迈向AI的搜索机制
  • 【WRF理论第十二期】输出文件:wrfout 和 wrfrst
  • 卷积神经网络之Yolo详解
  • 如何使用 Web Scraper API 高效采集 Facebook 用户帖子信息
  • C语言入门到精通(第六版)——第十六章
  • vite + vue3 + ts解决别名引用@/api/user报错找不到相应的模块
  • 前端系统设计面试题(二)Javascript\Vue
  • 从 MySQL 5.7 到 8.0:理解 GROUP BY 的新规则与实战优化20241112
  • 3D 数组插值 MATLAB
  • vue2 动态路由的实现
  • Leetcode 整数转罗马数字
  • webpack5 + vue3 从零配置项目
  • 低代码集成多方API的简单实现
  • 力扣113:路径总和II
  • 蓝领招聘二期笔记
  • 标题:网络安全:数字时代的守护盾
  • Python基础学习-07不可重复的set集合
  • 10款音频剪辑工具的个人实践体验感受!!
  • PG实例CPU使用率高排查思路
  • pyflink datastream数据流ds经过一系列转换后转为table,t_env.from_data_stream(ds)
  • 【C++学习(35)】在Linux中基于ucontext实现C++实现协程(Coroutine),基于C++20的co_await 协程的关键字实现协程
  • 机器学习在网络安全中的应用
  • 问:SQL优化,七条实践总结?
  • Rust枚举之卧龙凤雏(Rust Option枚举、Rust Result枚举)(Rust Enum、Some(T)、Ok(T)、Err(E))链式操作
  • TKinter实现与Dash应用的同步启停控制