Управление дескрипторами в Win32
Эта проблема достаточно сложна, так что имеет смысл рассмотреть что именно происходит, когда мы запускаем функцию Win32 для закрытия мьютекса или семафора. В частности, полезное знать вот что:
· Разблокирует ли закрытие дескриптора потоки, ожидающие данный мьютекс или семафор?
· В случае мьютексов, есть ли разница, кто владеет дескриптором при освобождении мьютекса?
Чтобы узнать это, мы можем использовать два текстовых приложения, для мьютекса
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);
Public
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)
Protected
procedure Execute; override ;
end ;
Implementation
uses HandleForm;
procedure THandleThread.Execute;
Var
RetVal: integer;
Begin
RetVal := WaitForSingleObject(HandleFrm.Mutex, INFINITE);
CaseRetVal 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 .
и для семафора
unit HandleForm;
Interface
Uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
Type
THandleFrm = class (TForm)
CreateBtn: TButton;
CloseOwnerBtn: TButton;
CloseNonOwnerBtn: TButton;
RelBtn: TButton;
procedure CreateBtnClick(Sender: TObject);
procedure CloseOwnerBtnClick(Sender: TObject);
procedure CloseNonOwnerBtnClick(Sender: TObject);
procedure RelBtnClick(Sender: TObject);
Private
{ Private declarations }
Public
{ Public declarations }
Semaphore: THandle;
end ;
Var
HandleFrm: THandleFrm;
Поиск по сайту: