ВУЗ:
Составители:
Рубрика:
21
жатом состоянии, извещая об этом факте окружающих . Аналогично , и
объект может быть в двух состояниях , а «слышать» его могут многие потоки
сразу.
Класс TEvent (модуль SYNCOBJS.PAS) имеет два метода: SetEvent и
ResetEvent, которые переводят объект в активное и пассивное состояние соот-
ветственно . Конструктор имеет следующий вид:
constructor Create(EventAttributes: PSecurityAttributes;
ManualReset, InitialState: Boolean; const Name: string);
Здесь параметр InitialState – начальное состояние объекта , ManualReset –
способ его сброса (перевода в пассивное состояние). Если этот параметр равен
True, событие должно быть сброшено вручную . В противном случае событие
сбрасывается по мере того , как стартует хоть один поток, ждавший данный
объект.
На третьем методе:
TWaitResult = (wrSignaled, wrTimeout, wrAbandoned, wrError);
function WaitFor(Timeout: DWORD): TWaitResult;
остановимся подробнее. Он дает возможность ожидать активизации события в
течение Timeout милисекунд. Внутри этого метода происходит вызов функции
API WaitForSingleObject, объявленной следующим образом:
function WaitForSingleObject(hHandle: THandle; dwMiliseonds:
DWORD): DWORD; stdcall;
Типичных результатов на выходе WaitFor два – wrSignaled, если произошла
активизация события, и wrTimeout, если за время тайм-аута ничего не про -
изошло . Если нужно (и допустимо !) ждать бесконечно долго , следует устано -
вить параметр Timeout в значение INFINITE.
В листинге 5 показан способ синхронизации инициализирующих массив по -
токов с помощью событий.
Листинг 5. Использование событий
unit Main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics,
Controls, Forms,
Dialogs, StdCtrls, SYNCOBJS;
type
TMainForm = class(TForm)
Button1: TButton;
ListBox1: TListBox;
procedure Button1Click(Sender: TObject);
private
procedure ThreadsDone(Sender: TObject);
public
{ Public declarations }
end;
TFooThread = class(TThread)
protected
21 ж атом со стоянии, извещ ая о б этом факте о круж аю щ их . Анало гично , и о бъ ектмо ж етбы ть в двух со стояниях , а «слы ш ать» его мо гутмно гие по токи сразу. Класс TEvent (мо дуль SYNCOBJS.PAS) имеет два метода: SetEvent и ResetEvent, ко т о ры е перево дято бъ ектв активно е и пассивно е со стояние со о т- ветственно . Ко нструктор имеетследую щ ий вид: constructor Create(EventAttributes: PSecurityAttributes; ManualReset, InitialState: Boolean; const Name: string); Здесь параметр InitialState – начально е со стояние о бъ екта, ManualReset – спо со б его сбро са (перево да в пассивно е со стояние). Е сли этотпараметр равен True, со бы т ие до лж но бы ть сбро ш ено вручную . В про тивно м случае со бы тие сбрасы вается по мере того , как стартуетх о ть о дин по ток, ж давш ий данны й о бъ ект. Н атретьем методе: TWaitResult = (wrSignaled, wrTimeout, wrAbandoned, wrError); function WaitFor(Timeout: DWORD): TWaitResult; о стано вимся по дро бнее. О н даетво змо ж но сть о ж идать активизации со бы тия в течение Timeout милисекунд. В нутри этого методапро исх о дитвы зо в функции API WaitForSingleObject, о бъ явленно й следую щ им о бразо м: function WaitForSingleObject(hHandle: THandle; dwMiliseonds: DWORD): DWORD; stdcall; Т ипичны х результатовнавы х о деWaitFor два–wrSignaled, если про изо ш ла активизация со бы тия, и wrTimeout, если за время тайм-аута ничего не про - изо ш ло . Е сли нуж но (и до пустимо !) ж дать беско нечно до лго , следуетустано - витьпараметрTimeout взначение INFINITE. В листинге 5 по казан спо со б синх ро низации инициализирую щ их массив по - токо вспо мо щ ью со бы тий. Ли с т и н г 5. Ис п ользован и е с об ы т и й unit Main; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, SYNCOBJS; type TMainForm = class(TForm) Button1: TButton; ListBox1: TListBox; procedure Button1Click(Sender: TObject); private procedure ThreadsDone(Sender: TObject); public { Public declarations } end; TFooThread = class(TThread) protected
Страницы
- « первая
- ‹ предыдущая
- …
- 19
- 20
- 21
- 22
- 23
- …
- следующая ›
- последняя »