<8> 이벤트(Delphi 동시 프로그래밍)
이벤트(Event)는 동기화 객체 중 하나입니다.대기 중인 모든 라인에 접근할 수 있습니다.
8.1. TEvent
TEvent
류1는 System.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:
이벤트는 동기화 대상이기 때문에 전역 실례로 만들어지지만
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:
Event.WaitFor(5000)
류2는 TSimpleEvent
에 의해 정의되었다.현재 구현 시나리오에서
System.SyncObjs
클래스와 TSimpleEvent
클래스(이름 없는 이벤트)는 다름없음3.예전에도 구조기만 달랐다.constructor TSimpleEvent.Create;
begin
inherited Create(nil, True, False, '');
end;
See also:TEvent
류4는 매우 가벼운 활동이다.TLightweightEvent
에서 정의합니다.그러나 로컬 활동으로만 사용할 수 있습니다.. NET에 해당하는
System.SyncObjs
류.See also:
[ ← 7. 신호(동기화 대상) ] [ 목록에서 ↑ ] [ → 9. 비동기 라이브러리(APL) ]
ManualResetEventSlim
는 델피3 이후에 사용할 수 있습니다. ↩ TEvent
는 델피3 이후에 사용할 수 있습니다. ↩ TSimpleEvent
는 델피 2005년 이후TSimpleEvent
의 별명이다. ↩ TEvent
는 Delphi XE 이후에 사용할 수 있습니다. ↩ Reference
이 문제에 관하여(<8> 이벤트(Delphi 동시 프로그래밍)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/ht_deko/items/c6317b1bb7ad6dd47476텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)