------Solutions------
有点不明白lovelypengpeng(鹏鹏)说的主线程和用户界面线程,
好像Windows中UI程序的主线程就是处理用户界面的啊?
如果PostThreadMessage是在工作线程中的话,试试换成
SendMessage,这样在OnTest返回之前将一直等待,达到同样的效果
------Solutions------
用户界面线程可以在另一个线程中使用窗口,响应消息等等。其实它跟主线程没有什么区别
------Solutions------
tolovelypengpeng(鹏鹏)
你的辅助线程最好不要是一个UI,直接就是一个纯线程函数,也就是说没有任何窗体。因为如果你的线程函数是一个UI的话,那么它就有自己的消息队列,当你的主线程通过PostThreadMessage发送消息过来的时候,该消息就有可能被UI的消息队列所打乱,从而致使线程函数不能收到主线程的消息。试试用一个纯线程看,记住,不要出现任何窗体,连AfxMessageBox()都不要出现,我就吃过他的苦头。
------Solutions------
同意zgdhj95(我来自杭州)
使用单一线程处理UI,可以减少很多麻烦,事实上Delphi的VCL库就是这样做的
------Solutions------
WaitForSingleObject用于等待核心对象激发或超时返回,用于工作者线程。若用于UI线程,会造成阻塞消息,使界面反映迟缓;即便用超时处理,也会影响处理的效率。
MsgWaitForMultipleObjects用于同时等待核心对象激发和所需要的消息。因而有好的效率而不会影响界面的处理。
tolovelypengpeng(鹏鹏):
我的方法试过了没有?给大家一个交待。如果只是想看更多处理方法可以去看《Win32多线程程序设计》。
------Solutions------
tozgdhj95(我来自杭州):
"记住,不要出现任何窗体,连AfxMessageBox()都不要出现,我就吃过他的苦头。"用过::MessageBox(NULL,....)这样的形式吗?
------Solutions------
其实,很好跟踪的嘛?在SetEvent哪儿设置一个断点,在WaitForSingleObject哪儿设置一个断点,F5调试运行,看看到了SetEvent没有,如果没有那肯定是程序逻辑有问题,根本就没有地方触发事件WaitForSingleObject当然不能返回啦。如果到了,就检查一下SetEvent有没有返回错误,再看看SetEvent中Set的EVENT和WaitForSingleObject等的是不是同一个Event。。。waitforsingleobject大概就那么几个东西啦。不要怀疑这些API在什么UI线程不行之类的,这个世界上本无UI线程和工作线程之分,那些只是MFC引入的概念,他们和线程本身没有关系,只是和线程的工作性质有关系而已。
------Solutions------
todarkay(火凤凰):
“只是MFC引入的概念”,这是Windows引入的概念,不要弄错了,纯SDK编程也会有“UI线程和工作线程之分”,没有消息链,UI界面就不可能正常运转,COM中的STA模式就完成不了同步功能。
我在WaitForSingleObject吃过苦头。对于同步对象,WIN32函数之所以有这么多不同的函数,自然有它的道理。
兄弟,还是看看书再说吧!
------Solutions------
UI线程和工作线程的确有很大区别,建议将界面操作全部交给主线程,尽量不要阻塞它,工作线程来处理各种耗时或者可能阻塞的工作,通过消息进行联络。waitforsingleobject
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-23463-4.html
人若犯我
时代不同了
最先进的濒海战斗舰不就驻扎在新加坡么~
#易烊千玺##易烊千玺真的很不错##易烊千玺献声小王子#看着小王子觉得