WAIT_TIMEOUT等待的时间已过,对象仍然是非发信号状态
WAIT_FAILED语句出错
WaitForMultipleObjects()函数的使用:
WaitForMultipleObjects()与WaitForSingleObject()类似,只是它要么等待指定列表(由
lpHandles指定)中若干个互斥对象(由nCount决定)都变为有信号,要么等待一个列表
(由lpHandles指定)中的一个对象变为有信号(由bWaitAll决定)。该函数声明如下:
functionWaitForMultipleObjects(nCount:DWORD;lpHandles:PWOHandleArray;bWaitAll:
BOOL;dwMilliseconds:DWORD):DWORD;stdcall;
nCount参数表示句柄的数量,最大值为MAXIMUM_WAIT_OECTS(64),lpHandles参数
是指向句柄数组的指针,lpHandles类型可以为(Event,Mutex,Process,Thread,Semaphore)
数组,bWaitAll参数表示等待的类型,如果为True则等待所有信号量有效再往下执行,设
为False则当有其中一个信号量有效时就向下执行,dwMilliseconds参数表示超时时间,超
时后向下继续执行。
注意:除WaitForSingleObject()和WaitForMultipleObjects()外,你还可以使用
MsgWaitForMultipleObjects()函数。该函数的详细情况请看Win32API联机文档。
WaitForSingleObject()不仅仅用于互斥,也用于信号量或事件,因此这里用词为“事件对象”
而非互斥对象。在互斥例中,可以用互斥对象代替事件对象,同样,在信号量例中,也能以
信号量对象代替事件对象。createmutex
再次提示,当一个互斥对象不再被一个线程所拥有,它就处于发信号状态。此时首先调用
WaitForSingleObject()函数的线程就成为该互斥对象的拥有者,此互斥对象设为无信号状
态。当线程调用ReleaseMutex()函数并传递一个互斥对象的句柄作为参数时,这种拥有关
系就被解除,互斥对象重新进入发信号状态。ReleaseMutex()声明如下:
functionReleaseMutex(hMutex:THandle):BOOL;stdcall;
进程间需要同步时,只需要执行CreateMutex()建立一个互斥对象,需要同步的时候只需
要WaitForSingleObject(mutexhandle,INFINITE),释放时只需要ReleaseMutex(mutexhandle)
即可。
例:
//先在主线程中创建互斥对象
var
hMutex:THandle=0;//定义一个句柄
...
hMutex:=CreateMutex(nil,False,nil);//创建互斥对象,并返回其句柄
//在子线程的Execute方法中加入以下代码
WaitForSingleObject(hMutex,INFINITE);//互斥对象处于发信号状态时进入同步区,否则等待
...
ReleaseMutex(hMutex);
//最后记得要在主线程中释放互斥对象
CloseHandle(hMutex);//关闭句柄
(2).使用TMutex类
TMutex是在SyncObjs单元中定义的类,其是ThandleObject类的子类,要使用它需要先
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-32871-5.html
国人素质差