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

相关文章
相关标签/搜索