在多线程下面,有时候我们会希望等待某一线程完成了再继续做其他事情,要实现这个目的,可以使用Windows API函数WaitForSingleObject,或者WaitForMultipleObjects
这两个函数都会等待Object被标为有信号(signaled)时才返回的
那么,什么是信号呢?
简单来说,Windows下创建的Object都会被赋予一个状态量。如果Object被激活了,或者正在使用,那么该Object就是无信号,也就是不可用;另一方面,如果Object可用了,那么它就恢复有信号了。
这两个函数的优点是它们在等待的过程中会进入一个非常高效沉睡状态,只占用极少的CPU时间片
WaitForSingleObject有两个参数,分别是THandle和Timeout(毫秒单位)。如果想要等待一条线程,那么你需要指定线程的Handle,以及相应的Timeout时间。当然,如果你想无限等待下去,Timeout参数可以指定系统常量INFINITE。例如:
WaitForSingleObject(aThread.Handle, INFINITE);
相对来说,WaitForMultipleObjects要复杂点点,它有四个参数,分别是
1. cObject,DWORD类型,用于指定句柄数组的数量
2. lphObjects,Pointer类型,用于指定句柄数组的内存地址
3. fWaitAll,Boolean类型,True表示函数等待所有指定句柄的Object有信号为止
4. dwTimeout,DWORD类型,用于指定等待的Timeout时间,单位毫秒,可以是INFINITE
例如
var
handles: Array[0..4] of THandle;
threads: Array[0..4] of TMyThread;
i: Integer;
begin
for i := 0 to 4 do begin
threads[i] := TMyThread.Create(False);
handles[i] := threads[i].Handle;
end;
WaitForMultipleObjects(5, @handles, True, INFINITE);
end;