WaitForMultipleObjects是Windows中的一個功能很是強大的函數,幾乎能夠等待Windows中的全部的內核對象(關於該函數的描述和例子見MSDN)。數據庫
//線程外: FMgrHandle :THandle; FMgrHandle := CreateEvent(nil,True,False,nil); //建立事件,返回handle CloseHandle(FMgrHandle); FThreads[i] := TDealDataThread.Create(False,FMgrHandle,OnDoTaskEvent);//傳入線程 SetEvent(FMgrHandle); //通知線程工做 ResetEvent(FMgrHandle);//通知線程休息 SetEvent(FMgrHandle); //---------------如下爲線程中 FTerminal :THandle; FTerminal := CreateEvent(nil,True,False,nil); SetEvent(FTerminal); //當須要結束線程 時 激活這個內核 便可; //如: procedure TDealDataThread.Terminate; begin inherited Terminate;; SetEvent(FTerminal); end; procedure TDealDataThread.Execute; type THandleID = (hidHostHandle, hidTerminate); //枚舉 var Handles :array[ThandleID] of THandle; //THandle 的大小爲2的一維數組 begin Handles[hidHostHandle] := FHandle; Handles[hidTerminate] := FTerminal; while Not Self.Terminated do begin case WaitForMultipleObjects(Length(Handles),@Handles,False,INFINITE) of
//Length(Handles) 爲2, 傳入數組名 ,只要一個觸發就往下執行 ;返回事件對應的 數組下標 WAIT_OBJECT_0 + Ord(hidHostHandle): //0+0 begin FDoTask; end; WAIT_OBJECT_0 + Ord(hidTerminate): //0+1 begin Break; //這樣就結束線程了。 end; end; end; end;
WaitForSingleObject()
http://chinaxyw.iteye.com/blog/548622數組
http://blog.csdn.net/xiaobai1593/article/details/6672193網絡
微軟提供了另一個函數能夠解決該問題,它就是MsgWaitForMultipleObjects()函數,該函數不但能夠等待事件,還能夠等待消息,從而處理消息,使線程不阻塞。該函數的具體解釋前參考MSDN或網絡。這個函數便可以等待信號(thread,event,mutex等等),也能夠等待消息(MSG)函數
http://blog.csdn.net/cbnotes/article/details/38582899spa