Мои Конспекты
Главная | Обратная связь


Автомобили
Астрономия
Биология
География
Дом и сад
Другие языки
Другое
Информатика
История
Культура
Литература
Логика
Математика
Медицина
Металлургия
Механика
Образование
Охрана труда
Педагогика
Политика
Право
Психология
Религия
Риторика
Социология
Спорт
Строительство
Технология
Туризм
Физика
Философия
Финансы
Химия
Черчение
Экология
Экономика
Электроника

Управление дескрипторами в Win32



Эта проблема достаточно сложна, так что имеет смысл рассмотреть что именно происходит, когда мы запускаем функцию Win32 для закрытия мьютекса или семафора. В частности, полезное знать вот что:

· Разблокирует ли закрытие дескриптора потоки, ожидающие данный мьютекс или семафор?

· В случае мьютексов, есть ли разница, кто владеет дескриптором при освобождении мьютекса?

Чтобы узнать это, мы можем использовать два текстовых приложения, для мьютекса

unitHandleForm;

 

Interface

Uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

StdCtrls;

 

Type

THandleFrm = class(TForm)

CreateBtn: TButton;

CloseOwnerBtn: TButton;

CloseNonOwnerBtn: TButton;

procedureCreateBtnClick(Sender: TObject);

procedureCloseOwnerBtnClick(Sender: TObject);

procedureCloseNonOwnerBtnClick(Sender: TObject);

Public

Mutex: THandle;

end;

 

Var

HandleFrm: THandleFrm;

 

Implementation

usesHandleThreads;

 

{$R *.DFM}

 

procedureTHandleFrm.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;

 

procedureTHandleFrm.CloseOwnerBtnClick(Sender: TObject);

Begin

CloseHandle(Mutex);

end;

 

procedureTHandleFrm.CloseNonOwnerBtnClick(Sender: TObject);

Begin

ReleaseMutex(Mutex);

CloseHandle(Mutex);

end;

 

end.

 

unitHandleThreads;

 

Interface

Uses

Classes, Windows, SysUtils, Dialogs;

 

Type

THandleThread = class(TThread)

Protected

procedureExecute; override;

end;

 

Implementation

usesHandleForm;

 

procedureTHandleThread.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.

и для семафора

unitHandleForm;

 

Interface

Uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

StdCtrls;

Type

THandleFrm = class(TForm)

CreateBtn: TButton;

CloseOwnerBtn: TButton;

CloseNonOwnerBtn: TButton;

RelBtn: TButton;

procedureCreateBtnClick(Sender: TObject);

procedureCloseOwnerBtnClick(Sender: TObject);

procedureCloseNonOwnerBtnClick(Sender: TObject);

procedureRelBtnClick(Sender: TObject);

Private

{ Private declarations }

Public

{ Public declarations }

Semaphore: THandle;

end;

 

Var

HandleFrm: THandleFrm;