MFC 多线程环境下,更新界面的问题

enic 2010-06-10 10:06:19
我知道的最漂亮的方式是 消息机制
那啥,你不要来问我,我到了会通知你

但是个人觉得消息机制比较麻烦,而且,如果我想传递大量的内存块,可能会因为发送太快处理太慢而内存告急。
比如实时图像,一个线程专门抓图,如何发到主线程去。有能像消息一样优雅。


...全文
517 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
enic 2010-06-24
  • 打赏
  • 举报
回复
容哥说的非常正确。
不过,我的本意是不是直接传递智能指针,而是再封装一次消息参数。

我发现com里边 有类似的技术,过一阵再来结贴。
lvshaoqing 2010-06-12
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 arong1234 的回复:]
好吧,那你用用看

引用 19 楼 lvshaoqing 的回复:
引用 18 楼 arong1234 的回复:
有什么不可以的啊。 先不说指针大小是否是64位的。 及时是的话,也可以高低字节分开,发到消息的两个参数中。
[/Quote]

?????????
arong1234 2010-06-12
  • 打赏
  • 举报
回复
好吧,那你用用看
[Quote=引用 19 楼 lvshaoqing 的回复:]
引用 18 楼 arong1234 的回复:
有什么不可以的啊。 先不说指针大小是否是64位的。 及时是的话,也可以高低字节分开,发到消息的两个参数中。[/Quote]
lvshaoqing 2010-06-12
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 arong1234 的回复:]
你测试过真可以?消息只能带4字节的数据,按值传送必须确保智能指针小于等于4字节,这几乎是不可能的。所以不要妄下结论。

至于“发送太快,处理太慢”的问题,说明你待处理数据的量大于你的处理能力,如果消息不行,其他方法一定也有问题

引用 7 楼 cl_gamer 的回复:
可以的
按值传递可以

我的一贯风格是 ui线程 不允许wait

用消息机制可能会出现这样的情况:发送太快……
[/Quote]

有什么不可以的啊。 先不说指针大小是否是64位的。 及时是的话,也可以高低字节分开,发到消息的两个参数中。
arong1234 2010-06-12
  • 打赏
  • 举报
回复
你测试过真可以?消息只能带4字节的数据,按值传送必须确保智能指针小于等于4字节,这几乎是不可能的。所以不要妄下结论。

至于“发送太快,处理太慢”的问题,说明你待处理数据的量大于你的处理能力,如果消息不行,其他方法一定也有问题
[Quote=引用 7 楼 cl_gamer 的回复:]
可以的
按值传递可以

我的一贯风格是 ui线程 不允许wait

用消息机制可能会出现这样的情况:发送太快,处理太慢,时间一长内存就飚升。
[/Quote]
arong1234 2010-06-12
  • 打赏
  • 举报
回复
很简单的两个问题:
1。你能确保“智能指针”能被分成2个四字节么?更基本的,智能指针不是指针哦!你说的64位大概是说的64位指针吧,智能指针可不是一回事情
2。你怎么把一个C++对象分成“高”“低”两个字节?
[Quote=引用 21 楼 lvshaoqing 的回复:]
引用 20 楼 arong1234 的回复:
好吧,那你用用看

引用 19 楼 lvshaoqing 的回复:
引用 18 楼 arong1234 的回复:
有什么不可以的啊。 先不说指针大小是否是64位的。 及时是的话,也可以高低字节分开,发到消息的两个参数中。


?????????
[/Quote]
ForestDB 2010-06-11
  • 打赏
  • 举报
回复
帮顶。
lvshaoqing 2010-06-11
  • 打赏
  • 举报
回复
一个链表加锁不就解决了么。 界面现场不停的轮询链表,如果有数据就...
另外的现场就不停的向链表中加数据。
屎带芬 2010-06-11
  • 打赏
  • 举报
回复
用内存映射文件传递大数据量到ui线程,当数据变更时用event同步刷新界面,绝对好用,哥用过!
enic 2010-06-11
  • 打赏
  • 举报
回复
可以的
按值传递可以

我的一贯风格是 ui线程 不允许wait

用消息机制可能会出现这样的情况:发送太快,处理太慢,时间一长内存就飚升。
独酌逸醉 2010-06-11
  • 打赏
  • 举报
回复
指针传参。
lvshaoqing 2010-06-11
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 taodm 的回复:]
消息就是极优雅的方式了。等你真的所谓效率不够了再来讨论。
[/Quote]


....
lvshaoqing 2010-06-11
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 cl_gamer 的回复:]
引用 9 楼 lvshaoqing 的回复:
一个链表加锁不就解决了么。 界面现场不停的轮询链表,如果有数据就...
另外的现场就不停的向链表中加数据。


这样链表需要 读 写 都需要加锁
如果工作线程由于某些原因当掉了,ui也跟着完了
[/Quote]

工作线程由于某些原因当掉了? 难道你就不能捕获错误么。 如果当掉了,你就把锁释放。 捕获异常有什么问题? 链表数据中,UI线程只读的话,也完全可以不用加锁。
taodm 2010-06-11
  • 打赏
  • 举报
回复
消息就是极优雅的方式了。等你真的所谓效率不够了再来讨论。
enic 2010-06-11
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 lvshaoqing 的回复:]
一个链表加锁不就解决了么。 界面现场不停的轮询链表,如果有数据就...
另外的现场就不停的向链表中加数据。
[/Quote]

这样链表需要 读 写 都需要加锁
如果工作线程由于某些原因当掉了,ui也跟着完了
enic 2010-06-11
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 stephen_yin 的回复:]
用内存映射文件传递大数据量到ui线程,当数据变更时用event同步刷新界面,绝对好用,哥用过!
[/Quote]

event 需要查询么?
还是,主动通知?

我拒绝在UI中使用Wait***系列函数···
enic 2010-06-11
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 lvshaoqing 的回复:]
一个链表加锁不就解决了么。 界面现场不停的轮询链表,如果有数据就...
另外的现场就不停的向链表中加数据。
[/Quote]


珍爱声明,UI线程远离 锁···
arong1234 2010-06-10
  • 打赏
  • 举报
回复
智能指针是不可能通过消息传递的,所以不会是“消息+智能指针”
arong1234 2010-06-10
  • 打赏
  • 举报
回复
我想全局变量当然是不好的选择,但是消息+指针应该是比较好的方法,不知道楼主为什么不想用[Quote=引用 4 楼 cl_gamer 的回复:]
我觉得 加锁 和 全局变量 都很恶劣
又不像用 消息+智能 指针

求更犀利的方案···
[/Quote]
enic 2010-06-10
  • 打赏
  • 举报
回复
我觉得 加锁 和 全局变量 都很恶劣
又不像用 消息+智能 指针

求更犀利的方案···
加载更多回复(3)

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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