您的位置:首页 > 其它

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

2015-10-16 11:26 267 查看


Worker 线程中显示输出

此刻我想先打个岔,请各位看看,如何让

wo rker
线程把字符串放到列表框(

listbox)中。

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

我在程序中定义了一个消息,名为

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

请注意,我一直仰赖一件事实:所有的数据可以被所有的线程取用。我使用sprintf()

在线程的堆栈中产生一个字符串,然后将此字符串地址以
SendMessage()送出。主线程在更新列表框的画面时,即使用到这个地址,一旦主线程完成这个消息的处理,

SendMessage()
便返回,
worker
线程于是继续进行下去。想象一下,如果我以
PostMessage()
代替
SendMessage()
,会发生什么情况?由于
PostMessage()
会立刻返回,所以当主线程抓取字符串内容要显示时,或许该字符串内容早已又被
wo rker
线程改写了。这就是多线程序设计中最常见的一种两难取舍:在最佳速度和最佳安全性之间取舍。在这里我宁愿选择比较慢但是比较安全的做法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: