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/38582899

posted @ 2016-05-23 21:04  海蓝7  阅读(1057)  评论(0编辑  收藏  举报