쓰레드는 처음인 허접입니다.
다음과 같은 CODE를 실행시키니 TEvent의 Destroy시 TEvent의 WaitFor가 응답을 않네요.
Help에는 wrAbandoned로 return값을 가지고 WaitFor가 응답을 한다고 나와 있는데...
뭐가 문제일까요.
부디 고수님의 조언을 부탁드립니다.
//-------------
// 여기 부터...
//-------------
type
TTestThread = class(TThread)
private
Evt: TEvent;
public
constructor Create;
procedure DestroyEvent;
procedure Execute; override;
procedure ExecuteEvent;
end;
TfrmMan = class(TForm)
btnCrt: TButton;
btnDty: TButton;
btnExe: TButton;
procedure btnCrtClick(Sender: TObject);
procedure btnDtyClick(Sender: TObject);
procedure btnExeClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
frmMan: TfrmMan;
implementation
{$R *.DFM}
var
TestThread: TTestThread;
constructor TTestThread.Create;
begin
inherited Create(True);
Evt := TEvent.Create(nil, false, false, 'Event');
Resume;
end;
procedure TTestThread.DestroyEvent;
begin
Evt.Destroy;
end;
procedure TTestThread.ExecuteEvent;
begin
Evt.SetEvent;
end;
procedure TTestThread.Execute;
begin
while True do begin
if (Evt.WaitFor(INFINITE) = wrAbandoned) then begin
ShowMessage('Abandoned');
break;
end;
ShowMessage('Execute');
end;
end;
procedure TfrmMan.btnCrtClick(Sender: TObject);
begin
TestThread := TTestThread.Create;
end;
procedure TfrmMan.btnDtyClick(Sender: TObject);
begin
TestThread.DestroyEvent;
end;
procedure TfrmMan.btnExeClick(Sender: TObject);
begin
TestThread.ExecuteEvent;
end;
//-------------
// 여기까지 ...
//-------------
Delphi Help에는 TEvent의 Destroy시 WaitFor에 반응한다고 되어있지만,
TEvent의 source를 봤더니, WaitForSingledObject를 call하더군요.
WaitForSingleObject의 Return값이 Abnormal인 경우는 Mutex의 경우에 한정
된다고 Help에 나와 있군요.
결국, 저는 Delphi Help에 속은 겁니다.
그래서 다음과 같이 source를 수정했습니다.
아직도 초보 wrote:
> 쓰레드는 처음인 허접입니다.
>
> 다음과 같은 CODE를 실행시키니 TEvent의 Destroy시 TEvent의 WaitFor가 응답을 않네요.
> Help에는 wrAbandoned로 return값을 가지고 WaitFor가 응답을 한다고 나와 있는데...
> 뭐가 문제일까요.
>
> 부디 고수님의 조언을 부탁드립니다.
>
> //-------------
> // 여기 부터...
> //-------------
> type
> TTestThread = class(TThread)
> private
> Evt: TEvent;
> public
> constructor Create;
> procedure DestroyEvent;
> procedure Execute; override;
> procedure ExecuteEvent;
> end;
>
> TfrmMan = class(TForm)
> btnCrt: TButton;
> btnDty: TButton;
> btnExe: TButton;
> procedure btnCrtClick(Sender: TObject);
> procedure btnDtyClick(Sender: TObject);
> procedure btnExeClick(Sender: TObject);
> private
> { Private declarations }
> public
> { Public declarations }
> end;
>
> var
> frmMan: TfrmMan;
>
> implementation
>
> {$R *.DFM}
> var
> TestThread: TTestThread;
>
> constructor TTestThread.Create;
> begin
> inherited Create(True);
> Evt := TEvent.Create(nil, false, false, 'Event');
> Resume;
> end;
>
> procedure TTestThread.DestroyEvent;
> begin
> //Evt.Destroy;
>> Terminate;
> end;
>
> procedure TTestThread.ExecuteEvent;
> begin
> Evt.SetEvent;
> end;
>
> procedure TTestThread.Execute;
> begin
>> FreeOnTerminate := True;
>>
>> while not Terminated do begin
>> ShowMessage('Execute');
>> Evt.WaitFor(INFINITE);
> end;
> end;
>
> procedure TfrmMan.btnCrtClick(Sender: TObject);
> begin
> TestThread := TTestThread.Create;
> end;
>
> procedure TfrmMan.btnDtyClick(Sender: TObject);
> begin
> TestThread.DestroyEvent;
> end;
>
> procedure TfrmMan.btnExeClick(Sender: TObject);
> begin
> TestThread.ExecuteEvent;
> end;
>
> //-------------
> // 여기까지 ...
> //-------------
>
>