Создание многопоточных приложений. Копытин А.В - 21 стр.

UptoLike

Составители: 

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