unit HandleForm; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type THandleFrm = class(TForm) CreateBtn: TButton; CloseOwnerBtn: TButton; CloseNonOwnerBtn: TButton; procedure CreateBtnClick(Sender: TObject); procedure CloseOwnerBtnClick(Sender: TObject); procedure CloseNonOwnerBtnClick(Sender: TObject); private { Private declarations } public { Public declarations } Mutex: THandle; end; var HandleFrm: THandleFrm; implementation uses HandleThreads; {$R *.DFM} procedure THandleFrm.CreateBtnClick(Sender: TObject); var NewThread: THandleThread; begin Mutex := CreateMutex(nil, false, nil); WaitForSingleObject(Mutex, INFINITE); NewThread := THandleThread.Create(false); NewThread := THandleThread.Create(false); ShowMessage('Threads Created.'); end; procedure THandleFrm.CloseOwnerBtnClick(Sender: TObject); begin CloseHandle(Mutex); end; procedure THandleFrm.CloseNonOwnerBtnClick(Sender: TObject); begin ReleaseMutex(Mutex); CloseHandle(Mutex); end; end. unit HandleThreads; interface uses Classes, Windows, SysUtils, Dialogs; type THandleThread = class(TThread) private { Private declarations } protected procedure Execute; override; end; implementation uses HandleForm; procedure THandleThread.Execute; var RetVal: integer; begin RetVal := WaitForSingleObject(HandleFrm.Mutex, INFINITE); case RetVal of WAIT_OBJECT_0: ShowMessage('Unblocked: WAIT_OBJECT_0'); WAIT_ABANDONED: ShowMessage('Unblocked: WAIT_ABANDONED'); WAIT_TIMEOUT: ShowMessage('Unblocked: WAIT_TIMEOUT'); else ShowMessage('Unblocked. Unknown return code.'); end; end; end.