WaitForMultipleObjects---幾乎能夠等待Windows中的全部的內核對象 - WaitForSingleObject()區別

WaitForMultipleObjects是Windows中的一個功能很是強大的函數,幾乎能夠等待Windows中的全部的內核對象(關於該函數的描述和例子見MSDN)。數據庫

原型:DWORD WaitForMultipleObjects(
DWORD nCount,
const HANDLE* lpHandles,
BOOL bWaitAll,
DWORD dwMilliseconds
);
當WaitForMultipleObjects等到多個 內核對象的時候,若是它的bWaitAll 參數設置爲false。其返回值減去WAIT_OBJECT_0 就是參數lpHandles 數組的序號。若是同時有多個內核對象被觸發,這個函數返回的只是其中序號最小的那個。若是爲TRUE 則等待全部 信號量有效再往下執行。(FALSE 當有其中一個信號量有效時就向下執行)
問題就在這裏,咱們如何能夠獲取全部被同時觸發的內核對象。舉個例子:咱們須要在一個線程中處理從 完成端口、數據庫、和可等待 定時器來的數據。一個典型的實現方法就是:用WaitForMultipleObjects等待全部的這些事件。若是完成端口,數據庫發過來的數據量很是大,可等待定時器時間也只有幾十毫秒。那麼這些事件同時觸發的概率能夠說很是大,咱們不但願丟棄任何一個被觸發的事件。那麼如何能高效地實現這一處理呢?
 
//線程外:
 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

相關文章
相關標籤/搜索