쓰레드를 소멸시킬 때 쓰레드 외부에서 (예를 들면 버튼 클릭 이벤트라던지) 소멸시킬 땐
성공적으로 소멸이 됩니다.
그런데, 쓰레드로 네트워크 통신을 할 때 통신이 디스커넥트 될 때 쓰레드를 소멸시키려고 하였습니다.
그러니까
procedure TCltThrd.Execute;
var
ErrorBool: Boolean;
begin
// 앞부분에서 처리 후 Error 체크를 한 후
// Error 발생 시 ErrorBool에 True를 입력.
if ErrorBool then
TCPClt.Disconnect;
end;
이고,
procedure TForm1.IdTCPClient1Disconnected(Sender: TObject);
begin
if assigned(CltThrd) then
begin
CltThrd.Terminate;
CltThrd.Free;
CltThrd := nil;
end;
end;
로 해주는데요.
이 CltThrd라는 쓰레드가 죽지 않네요.
그래서 다시 쓰레드를 생성하는 메시지를 해도 서버로부터 메시지를
못읽어 오는군요. 뭔가 방법이 없을까요?
Thread.Terminate 함수는 단순히 TThread 내부의 FTerminated를 True로 바꾸어주는 역할밖에 하지 않습니다.
따라서, 생성한 Thread의 Execute 함수가 Terminated property를 가지고 Loop를 돌지 않는다면, Loop를 빠져나갈 수가 없겠죠.
따라서, 에러가 아닌 정상적인 경우에 종료하는 루틴을 삽입하셔야 할 것 같습니다.
보통의 경우 while Terminated <> true do 뭐 이런식으로 loop를 시작하는데, 참고하시기 바랍니다.
그럼 즐프하세요.