<8> 이벤트(Delphi 동시 프로그래밍)

8. 이벤트(동기화 대상)
이벤트(Event)는 동기화 객체 중 하나입니다.대기 중인 모든 라인에 접근할 수 있습니다.
8.1. TEventTEvent1System.SyncObjs에 의해 정의되었다.
첫 번째 형식의 구조기에서 이름이 비어 있지 않으면 시스템 이벤트를 만들 것입니다.ManualReset 매개변수가 True이면 수동 이벤트가 되고 ResetEvent() 메서드를 실행하지 않으면 비신호 상태가 되지 않습니다.False는 자동으로 리셋되며 WaitFor() 방법에서 대기된 라인을 처리하기 시작하면 비신호 상태가 됩니다.InitialState 속성은 신호의 초기 상태이다.True는 신호 상태이고 False는 비신호 상태입니다.
두 번째 형식의 구조기를 사용하면 이름 없는 이벤트를 만들 것입니다.익명 활동은 로컬 활동입니다.수동 재설정, 비신호 상태에서 생성.
constructor Create(EventAttributes: PSecurityAttributes; ManualReset, InitialState: Boolean; const Name: string; UseCOMWait: Boolean = False);
constructor Create(UseCOMWait: Boolean = False);
1기의 이 범주는 Windows API로 구성됩니다.
Delphi
Windows API
TEvent.Create()구조기
CreateEventA() / CreateEventW()
TEvent.WaitFor 속성
WaitForSingleObject()
TEvent.SetEvent() 방법
SetEvent()
TEvent.ResetEvent() 방법
ResetEvent() WaitFor() 방법으로 대기할 수 있는 스레드 알림 이벤트(비신호->신호).
See also:
  • System.SyncObjs.TEvent (DocWiki)
  • 8.1.1. 로컬 인스턴스에 사용되는 TEvent
    이벤트는 동기화 대상이기 때문에 전역 실례로 만들어지지만 SetEvent()의 필드로 사용하면 재미있습니다.
    다음 단원을 제작합니다.
    uEVThread.pas
    unit uEVThread;
    
    interface
    
    uses
      System.Classes, System.SyncObjs, Vcl.StdCtrls;
    
    type
      TEvThread = class(TThread)
      private
        FEvent: TEvent;
        FComponent: TComponent;
      protected
        procedure TerminatedSet; override;
      public
        constructor Create(Component: TComponent); overload;
        destructor Destroy; override;
        procedure Stop;
        property  Event: TEvent read FEvent write FEvent;
        property  Component: TComponent read FComponent write FComponent;
      end;
    
    implementation
    
    { TEvThread }
    
    constructor TEvThread.Create(Component: TComponent);
    begin
      FEvent := TEvent.Create;
      FComponent := Component;
      FreeOnTerminate := True;
      inherited Create(True);
    end;
    
    destructor TEvThread.Destroy;
    begin
      FEvent.Free;
      inherited;
    end;
    
    procedure TEvThread.Stop;
    begin
      Terminate;
      FEvent.SetEvent;
    end;
    
    procedure TEvThread.TerminatedSet;
    begin
      inherited;
      FEvent.SetEvent;
    end;
    end.
    
    창에 비망록과 단추가 있는 프로그램을 만듭니다.
    uses
      ..., uEvThread;
    
    type
      TMyThread = class(TEvThread)
      protected
        procedure Execute; override;
      end;
    ...
    
    { TMyThread }
    
    procedure TMyThread.Execute;
    begin
      inherited;
      if not Terminated then
        begin
          TThread.Sleep(5000);
          Synchronize(
            procedure
            begin
              (Component as TMemo).Lines.Add('Start');
            end
          );
        end;
    end;
    
    두 단추의 활성 처리 프로그램은 이렇다.
    // [Start] ボタン
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      Memo1.Clear;
      MyThread := TMyThread.Create(Memo1);
      MyThread.Start;
    end;
    
    // [Stop] ボタン
    procedure TForm1.Button2Click(Sender: TObject);
    begin
      MyThread.Stop; // または MyThread.Terminate;
      Memo1.Lines.Add('Stop');
    end;
    
    [start] 버튼을 누르면 [stop] 버튼을 누르면 취소TThread가 되지 않으므로 [start] 버튼을 5초 누르면'Start'가 표시됩니다.

    이어서 Sleep(5000) 방법 내Execute()Sleep(5000)로 변경한다.
    procedure TMyThread.Execute;
    begin
      inherited;
      if not Terminated then
        begin
    //    TThread.Sleep(5000);
          Event.WaitFor(5000); // <-
          Synchronize(
            procedure
            begin
              (Component as TMemo).Lines.Add('Start');
            end
          );
        end;
    end;
    
    나는 이번에 [stop] 버튼을 누르면 곧'Start'가 나타날 것이라고 생각한다."물론""Start""를 표시하지 않을 수도 있습니다."
    procedure TMyThread.Execute;
    begin
      inherited;
      if not Terminated then
        begin
          Event.WaitFor(5000);
          if not Terminated then // <-
            Synchronize(
              procedure
              begin
                (Component as TMemo).Lines.Add('Start');
              end
            );
        end;
    end;
    

    See also:
  • Implement override for thread Terminate method (StackOverflow)
  • 8.2. TSimpleEventEvent.WaitFor(5000)2TSimpleEvent에 의해 정의되었다.
    현재 구현 시나리오에서 System.SyncObjs 클래스와 TSimpleEvent 클래스(이름 없는 이벤트)는 다름없음3.예전에도 구조기만 달랐다.
    constructor TSimpleEvent.Create;
    begin
      inherited Create(nil, True, False, '');
    end;
    
    See also:
  • System.SyncObjs.TSimpleEvent (DocWiki)
  • 8.3. TLightweightEventTEvent4는 매우 가벼운 활동이다.TLightweightEvent에서 정의합니다.그러나 로컬 활동으로만 사용할 수 있습니다.
    . NET에 해당하는System.SyncObjs류.
    See also:
  • System.SyncObjs.TLightweightEvent(DocWiki)
  • Manual ResetEventSlim 수준(docs.microsoft.com)
  • 참고 자료
  • 배타적 제어의 이벤트(Wikipedia)
  • 인덱스
    [ ← 7. 신호(동기화 대상) ] [ 목록에서 ↑ ] [ → 9. 비동기 라이브러리(APL) ] ManualResetEventSlim는 델피3 이후에 사용할 수 있습니다. 
    TEvent는 델피3 이후에 사용할 수 있습니다. 
    TSimpleEvent는 델피 2005년 이후TSimpleEvent의 별명이다. 
    TEvent는 Delphi XE 이후에 사용할 수 있습니다. 

    좋은 웹페이지 즐겨찾기