等待函数 WaitForSingleObject
MutexSemaphoreEventWaitableTimer 等同步手段都要使用这个函数; 虽然等待函数可不止 WaitForSingleObject 它一个, 但它最简单.

function WaitForSingleObject( 
  hHandle: THandle;      
{要等待的对象句柄} 
  dwMilliseconds: DWORD  
{等待的时间, 单位是毫秒} 
): DWORD; stdcall;       
{返回值如下:} 
 
WAIT_OBJECT_0  
{等着了, 本例中是: 等的那个进程终于结束了} 
WAIT_TIMEOUT   
{等过了点(你指定的时间), 也没等着} 
WAIT_ABANDONED 
{好不容易等着了, 但人家还是不让咱执行; 这一般是互斥对象} 
 
//WaitForSingleObject 的第二个参数一般给常数值 INFINITE, 表示一直等下去, 死等. 


WaitForSingleObject
等待什么? 在多线程里就是等待另一个线程的结束, 快来执行自己的代码; 不过它可以等待的对象可不止线程; 这里先来一个等待另一个进程结束的例子:

//WaitForSingleObject的示例代码文件: 
 
unit Unit1; 
 
interface 
 
uses 
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
  Dialogs, StdCtrls; 
 
type 
  TForm1 = 
class(TForm) 
    Button1: TButton; 
    
procedure Button1Click(Sender: TObject); 
  
end
 
var 
  Form1: TForm1; 
 
implementation 
 
{$R *.dfm} 
 
var 
  hProcess: THandle; 
{进程句柄} 
 
{等待一个指定句柄的进程什么时候结束} 
function MyThreadFun(p: Pointer): DWORD; stdcall; 
begin 
  
if WaitForSingleObject(hProcess, INFINITE) = WAIT_OBJECT_0 then 
    Form1.Text := Format(
'进程 %d 已关闭', [hProcess]); 
  Result := 
0
end
 
{启动一个进程, 并建立新线程等待它的结束} 
procedure TForm1.Button1Click(Sender: TObject); 
var 
  pInfo: TProcessInformation; 
  sInfo: TStartupInfo; 
  Path: 
array[0..MAX_PATH-1of Char; 
  ThreadID: DWORD; 
begin 
  
{先获取记事本的路径} 
  GetSystemDirectory(Path, MAX_PATH); 
  StrCat(Path, 
'\notepad.exe'); 
 
  
{用 CreateProcess 打开记事本并获取其进程句柄, 然后建立线程监视} 
  FillChar(sInfo, SizeOf(sInfo), 
0); 
  
if CreateProcess(Path, nilnilnil, False, 0nilnil, sInfo, pInfo) then 
  
begin 
    hProcess := pInfo.hProcess;                           
{获取进程句柄} 
    Text := Format(
'进程 %d 已启动', [hProcess]);  
    CreateThread(
nil0, @MyThreadFun, nil0, ThreadID); {建立线程监视} 
  
end
end
 
end.