Application.ProcessMessages执行的时候CPU利用率一定是100%吗?(50分)

  • 主题发起人 主题发起人 Jani
  • 开始时间 开始时间
理论上是,但你也知道,这是理论上说的,实际上.......
 
我也曾经遇到此问题,后来改成了Application.HandleMessage.
 
能具体说一下吗?<br>我在线程里有一个HTTPCli控件,线程需要等待这个控件的OnDocEnd事件。<br>我开始也想用Application.HandleMessage,但是那样好像线程里的HTTPCli控件也被Suspend起来了。<br>是这样吗?<br>我现在已经使用Waiforsigleobject解决了这个问题,不过对HandleMessage的用法也很感兴趣,能说的详细一些吗?<br>分数照样给哦,呵呵
 
我一直用Application.ProcessMessages,對HandleMessage和Waiforsigleobject的用法也很感兴趣,
 
Application.ProcessMessage不会使CPU占用率到100,不过我猜想你的程序结构应该是:<br>----------------------<br>while &lt;xxx&gt; do<br>&nbsp; Application.ProcessMessage;<br>end;<br>----------------------<br>反复的执行while循环体必然会使CPU反复调度此线程,如果你的程序一定要这么写的话,<br>则肯定存在一个设计上的失误!
 
Application.ProcessMessage本身是不会使CPU占100%的,可能是你在线程中做等待事件时<br>的循环语句中调用了他,才会出现CPU占100%。<br>其实如果想在线程中等待事件可以用WaitforSingleObject这个API
 
zag2000, 使用WaitForSingleObject也是不对的。因为既然要通过ProcessMessage处理消息,<br>就必须经常性地轮询,如果使用WaitForSingleObject则会一直等待内核对象激活,没有一点<br>用处。必须换成MsgWaitForMultipleObjects<br><br>DWORD MsgWaitForMultipleObjects(<br>&nbsp; DWORD nCount, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// number of handles in array<br>&nbsp; CONST HANDLE pHandles, // object-handle array<br>&nbsp; BOOL bWaitAll, &nbsp; &nbsp; &nbsp; &nbsp; // wait option<br>&nbsp; DWORD dwMilliseconds, &nbsp;// time-out interval<br>&nbsp; DWORD dwWakeMask &nbsp; &nbsp; &nbsp; // input-event type<br>);<br>在dwWakeMask中填入QS_ALLEVENTS即可。<br><br>
 
你的循环不停的执行cpu占用当然100%,其实最简单的办法就是在主循环加上一句<br>sleep(n);就OK了,n取很小就可以,也不至于让你的系统反应太慢。<br><br>象这样:<br>while &lt;xxx&gt; do<br>&nbsp; .......<br>&nbsp; Application.ProcessMessage;<br>&nbsp; sleep(n);<br>end;<br><br>
 
其实就是主动的把你的程序挂起一小会,让点时间片给人家
 
Application.HandleMessage ?<br><br>它和 Application.ProcessMessages ; 有何差别 ?
 
后退
顶部