主线程 子线程 通信 最好用同步方式
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
线程改写了。这就是多线程序设计中最常见的一种两难取舍:在最佳速度和最佳安全性之间取舍。在这里我宁愿选择比较慢但是比较安全的做法。
Worker 线程中显示输出
此刻我想先打个岔,请各位看看,如何让
wo rker
线程把字符串放到列表框(
listbox)中。
列表框的消息循环总是被程序的主线程掌管,虽然这并非绝对必要,但是让主线程负责所有的屏幕更新工作,是相当理想的。
我在程序中定义了一个消息,名为
WM_PLEA SE_UPDATE。当
wo rker线程认为需要把一笔新的项目放到列表框中时,就送这个消息给主线程。Worker
线程使用
SendMessage()
完成这件事情,以便制造出一种“函数调用”的效果。在主线程处理完毕该消息之前,
SendMessage()
不会返回,所以我们可以保证所有的输出有条不紊,不至于乱了次序。
请注意,我一直仰赖一件事实:所有的数据可以被所有的线程取用。我使用sprintf()
在线程的堆栈中产生一个字符串,然后将此字符串地址以
SendMessage()送出。主线程在更新列表框的画面时,即使用到这个地址,一旦主线程完成这个消息的处理,
SendMessage()
便返回,
worker
线程于是继续进行下去。想象一下,如果我以
PostMessage()
代替
SendMessage()
,会发生什么情况?由于
PostMessage()
会立刻返回,所以当主线程抓取字符串内容要显示时,或许该字符串内容早已又被
wo rker
线程改写了。这就是多线程序设计中最常见的一种两难取舍:在最佳速度和最佳安全性之间取舍。在这里我宁愿选择比较慢但是比较安全的做法。
相关文章推荐
- 杂
- Service和IntentService的区别
- Hbase pom.xml 里面可能夹着Spring 的jar..懒得删
- Android abd shell dumpsys命令探究
- Linux下高并发socket最大连接数所受的限制问题
- 倍数提高工作效率的Android Studio奇技
- 自旋锁(spinlock) 解释得经典,透彻
- 金色的 SQL注意事项(1)
- Binder相关
- win7全屏游戏后出现黑边的问题怎么解决?
- Java复用代码
- js实现新浪微博首页效果
- Ubuntu下PHPstorm的安装
- ios页面传值——代理方法
- Linux网络编程:基于TCP的程序开发(1)
- perl中q,qx,qq,qr,qw
- linux串口使用
- cocos2dx 3.2 定义自己使用rapidjson阅读json数据
- 压力测试和单元测试
- 运算符重载