关于WaitForSingleObject()函数的问题!(30分)

  • 主题发起人 主题发起人 leaber
  • 开始时间 开始时间
L

leaber

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