是指向句柄数组的指针,lpHandles类型可以为(Event,Mutex,Process,Thread,Semaphore)
数组,bWaitAll参数表示等待的类型,如果为True则等待所有信号量有效再往下执行,设
为False则当有其中一个信号量有效时就向下执行,dwMilliseconds参数表示超时时间,超
时后向下继续执行。
注意:除WaitForSingleObject()和WaitForMultipleObjects()外,你还可以使用
MsgWaitForMultipleObjects()函数。该函数的详细情况请看Win32API联机文档。
WaitForSingleObject()不仅仅用于互斥,也用于信号量或事件,因此这里用词为“事件对象”
而非互斥对象。在互斥例中,可以用互斥对象代替事件对象,同样,在信号量例中,也能以
信号量对象代替事件对象。
再次提示,当一个互斥对象不再被一个线程所拥有,它就处于发信号状态。此时首先调用
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类的子类,要使用它需要先
usesSyncObjs。它对上面的那些互斥操作API函数进行了封装,简化并方便了在Delphi
中的使用。
使用前先实例化TMutex类,其有多个重载的构造函数。声明如下:
7
constructorCreate(UseCOMWait:Boolean=False);overload;
constructorCreate(MutexAttributes:PSecurityAttributes;InitialOwner:Boolean;constName:
string;UseCOMWait:Boolean=False);overload;
constructorCreate(DesiredAccess:LongWord;InheritHandle:Boolean;constName:string;
UseCOMWait:Boolean=False);overload;
其实简单的直接调用TMutex.Create就可以返回一个TMutex对象。
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-32871-17.html