Terminate() 후에 종료되기를 기다리는건
WaitFor() 라는 메소드가 있어요..
필요시에 while 문으로 직접 다른일을 하면서 대기할 수도 있지만 Terminated 를 참조해서는 안됩니다.
Terminate() 를 호출하면 Terminated가 TRUE가 됩니다.
그래서 Thread의 Execute 내에서
while (!Terminated)
{
...
}
return;
처럼 사용을 하면 쓰레드 외부에서 Terminate() 함수를 호출하면 Terminated가 TRUE 가 되면서 쓰레드내의 루프에서 빠져나오게 됩니다.
Stop 이란 메소드는 처음보는것같아 찾아보니 인디쓰레드 메소드네요.. Suspend 되든지 Terminate 되든지 둘중 하나를 수행하는 건데, 종료시에는 그건 사용하지 마시고 그냥 Terminate()만 사용하시면 될것 같은데요...
IKG님 님이 쓰신 글 :
: 안녕하세요.
:
: 2009 사용중이고, Indy를 사용해서 만들고 있습니다.
:
: 테스트 삼아 텔넷으로 접속해서 데이터를 받는것은 아주 잘 되는데요,...
:
: 텔넷의 접속을 끊으면 CPU의 부하가 100%에 육박하도록 올라갑니다.
:
: 그러다가, 몇 초 후에,..
:
: ".... too many consecutive exceptions: 'access violation at 0x00000053: read of address 0x00000053..."
:
: 이런 메시지가 뜬 후, 먹통이 되면서 위의 메시지가 정기적으로 반복해서 계속 나옵니다.
:
: 쓰레드 상태를 보니, 죽지 않고 계속 살아 있더군요..
:
: 그래서, IdTCPServer1Disconnect 부분에,..
:
: ((TIdYarnOfThread*)(AContext->Yarn))->Thread->Stop();
: ((TIdYarnOfThread*)(AContext->Yarn))->Thread->Terminate();
:
: 등등 을 줬는데도,..
:
: 쓰레드가 죽지 않더군요..
:
: 다시 테스트 삼아...
: 아래와 같이 while문을 넣어놓으니깐, CPU 점유율은 올라가지 않고 정상상태인데,...
: 계속 while문 안에만 있습니다...
:
: void __fastcall TfrmMain::IdTCPServer1Disconnect(TIdContext *AContext)
: {
: ((TIdYarnOfThread*)(AContext->Yarn))->Thread->Stop();
: ((TIdYarnOfThread*)(AContext->Yarn))->Thread->Terminate();
:
: while(((TIdYarnOfThread*)(AContext->Yarn))->Thread->Terminated){
: ((TIdYarnOfThread*)(AContext->Yarn))->Thread->Terminate();
: Sleep(1);
: }
: }
:
:
: 조언 부탁드립니다..ㅠ.ㅠ;...
|