主线程 子线程 通信 最好用同步方式

Worker 线程中显示输出



此刻我想先打个岔,请各位看看,如何让 wo rker 线程把字符串放到列表框( listbox)中。

列表框的消息循环总是被程序的主线程掌管,虽然这并非绝对必要,但是让主线程负责所有的屏幕更新工作,是相当理想的。


我在程序中定义了一个消息,名为 WM_PLEA SE_UPDATEwo rker线程认为需要把一笔新的项目放到列表框中时,就送这个消息给主线程。Worker 线程使用 SendMessage() 完成这件事情,以便制造出一种“函数调用”的效果。在主线程处理完毕该消息之前, SendMessage() 不会返回,所以我们可以保证所有的输出有条不紊,不至于乱了次序



请注意,我一直仰赖一件事实:所有的数据可以被所有的线程取用。我使用sprintf() 在线程的堆栈中产生一个字符串,然后将此字符串地址以 SendMessage()送出。主线程在更新列表框的画面时,即使用到这个地址,一旦主线程完成这个消息的处理, SendMessage() 便返回, worker 线程于是继续进行下去。想象一下,如果我以 PostMessage() 代替 SendMessage() ,会发生什么情况?由于 PostMessage() 会立刻返回,所以当主线程抓取字符串内容要显示时,或许该字符串内容早已又被 wo rker 线程改写了。这就是多线程序设计中最常见的一种两难取舍:在最佳速度和最佳安全性之间取舍。在这里我宁愿选择比较慢但是比较安全的做法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值