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