Q&A

  • 쓰레드의 종료가 안되는데요...
쓰레드는 처음인 허접입니다.



다음과 같은 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;



//-------------

// 여기까지 ...

//-------------





1  COMMENTS
  • Profile
    아직도 초보 2001.09.04 04:36
    아직도 초보가 다시 씁니다.



    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;

    >

    > //-------------

    > // 여기까지 ...

    > //-------------

    >

    >