问题:关于多线程占用CPU资源的问题!(难!) ( 积分:100, 回复:17, 阅读:200 )<br>分类:多线程 ( 版主:垃圾清洁工, luyear ) <br>来自:黑狼, 时间:2003-3-23 9:19:00, ID:1703826 [显示:小字体 | 大字体] <br>简单代码如下:<br>procedure tsendthread.execute;<br>begin<br> while not terminated do<br> begin<br> if sign=true then<br> begin<br> //some code;<br> end;<br> end; <br>end;<br>sign为判断是否发送数据的标志位!问题出现在sign大部分时间是为false,所以此线程<br>就如同一个死循环一直在检查sign。<br>而且我写的程序页面控件比较多切换时页面时响应速度特别慢,我曾经试过降低此线程的<br>优先级,但是效果还是不好,而我创建这个线程的想法是此线程可以实时监控数据。<br>虽然,我用timesetevent可以解决这问题,但是我写的程序比较大了,改动起来特别费劲,<br>所以我想请各位高手帮我解决这个问题,用多线程的方法来解决,多谢了!<br><br> <br> <br>来自:zw84611, 时间:2003-3-23 9:36:00, ID:1703834 <br>procedure tsendthread.execute;<br>begin<br> while not terminated do<br> begin<br> if sign=true then<br> begin<br> //some code;<br> end;<br> sleep(50); //attention here.<br> end; <br>end;<br><br> <br> <br>来自:黑狼, 时间:2003-3-23 9:40:00, ID:1703839 <br>我试过了,不过效果也不好。如下:<br>application.progressmessages;<br>sleep(50);<br> <br> <br>来自:zw84611, 时间:2003-3-23 9:43:00, ID:1703842 <br>你用的是线程,不需要application.progressmessages<br> <br> <br>来自:黑狼, 时间:2003-3-23 9:49:00, ID:1703853 <br>是的,但是如果程序只执行<br>while not terminated do<br> if sign=true then<br>这两行时不也如同死循环吗?你可以试一试。连程序的关闭按钮也会无效的。<br> <br> <br>来自:xiaolin0522, 时间:2003-3-23 10:02:00, ID:1703872 <br>不要用变量来 实现同步,换用 信号量<br><br> <br> <br>来自:黑狼, 时间:2003-3-25 10:17:00, ID:1708004 <br>是用waitforsingleobject吗?怎么用,能给出具体代码吗?<br> <br> <br>来自:bbs-wqt, 时间:2003-3-25 10:20:00, ID:1708019 <br>嗯help!<br> <br> <br>来自:resun, 时间:2003-3-25 10:43:00, ID:1708107 <br>用sleep()是可以的,时间稍微长一些,效果会好点<br>用 WaitForSingleobject也可以<br>var<br> hMutex:THandle=0;//<br><br>hMutex:=CreateEvent(nil,false,false,nil); //信号源<br><br>在线程中<br> While not Terminated do<br> begin//while<br><br> WaitForSingleobject(hmutex,infinite);<br><br> //其它代码<br> end;<br><br>还需要一个timer定时发信号<br> setEvent(hMutex);//<br> <br> <br>来自:thx1180, 时间:2003-3-25 10:49:00, ID:1708139 <br> 可以用互斥对象实现线程同步。<br> 先在主线程中创建事件对象:<br>var<br> hMutex: THandle = 0;<br> ...<br> hMutex := CreateMutex(nil, False, nil);<br><br> 在线程的Execute方法中加入以下代码:<br> if WaitForSingleObject(hMutex, INFINITE) = WAIT_OBJECT_0 then<br> //Do Something;<br> ...<br> ReleaseMutex(hMutex);<br><br> 最后记得要释放互斥对象:<br> CloseHandle(hMutex);<br><br><br><br> <br> <br>来自:黑狼, 时间:2003-3-25 10:52:00, ID:1708157 <br>但是,我对信号量和互斥对象不怎么明白。<br>信号量是不是当一个对象被一个线程拥有时,它处于不发信号状态,相反则是发信号状态。<br>WaitForSingleobject(hmutex,infinite);<br>这一步它是怎么工作的,因为WaitForSingleobject只有三个返回值wait_object_0,<br>wait_timeout,另一个我忘了。<br>能给出一个具体的源代码吗?<br> <br> <br>来自:Milpas, 时间:2003-3-25 10:55:00, ID:1708174 <br>用Sleep把线程挂起一段时间,让OS把CPU时间分配给其它进程或线程<br> <br> <br>来自:wolaixue, 时间:2003-3-25 11:04:00, ID:1708226 <br>循环中加一句即可:<br>Sleep(0);<br> <br> <br>来自:qsilence, 时间:2003-3-25 11:08:00, ID:1708252 <br>推荐用TEVENT事件,用WaitForSingleobject等待,不需要进行大花消的循环<br> <br> <br>来自:yhl1118, 时间:2003-3-25 11:12:00, ID:1708275 <br>我觉得尽量不要在线程用sleep,要用MsgWaitForMultipleObjects,<br>在线程外用SetEvent来做终止等待的一些处理。<br> <br> <br>来自:thx1180, 时间:2003-3-25 11:15:00, ID:1708290 <br> 当一个互斥对象不再被一个线程所拥有,它就处于发信号状态。此时首先<br>调用WaitForSingleObject()函数的线程就成为该互斥对象的拥有者,此互斥<br>对象设为不发信号状态。当线程调用ReleaseMutex()函数并传递一个互斥对象<br>的句柄作为参数时,这种拥有关系就被解除,互斥对象重新进入发信号状态。<br><br>WaitForSingleObject函数的返值:<br> WAIT_ABANDONED指定的对象是互斥对象,并且拥有这个互斥对象的线程在<br>没有释放此对象之前就已终止。此时就称互斥对象被抛弃。这种情况下,这个<br>互斥对象归当前线程所有,并把它设为非发信号状态;<br> WAIT_OBJECT_0 指定的对象处于发信号状态;<br> WAIT_TIMEOUT等待的时间已过,对象仍然是非发信号状态;<br><br> 具体的源代码可以参考《Delphi 5开发人员指南》。<br> 到处有下载,用Google搜索一下。<br><br> <br> <br>来自:Headchen, 时间:2003-3-25 13:28:00, ID:1708740 <br>首先要确定你的任务是否一定需要线程来完成,若一定要线程来完成,在线程中不断进行循环<br>来检测一个变量不是一个好办法,上面的不少同志已经提供了不少思路,我这里提供另外一些思路:<br>可以在线程里面建立一个消息循环,在调用线程的地方通过postThreadMessage来进行触发就可以。<br> <br> <br>来自:黑狼, 时间:2003-3-26 15:02:00, ID:1712149 <br>程序我改完了,使用信号量的方法改的效果不错!^_^所以我决定把分数分给提出信号量<br>方法的兄弟们。<br> <br> <br>你可以在全文检索中输入这个函数名,可以找到一大堆相关的贴子.