답변감사합니다.
계속 문제가 해결되지 않아서 다시 질문올립니다. ㅠㅠ.
아래와 같이 해보면,...
void __fastcall TfrmMain::IdTCPServer1Disconnect(TIdContext *AContext)
{
int nID = ((TIdYarnOfThread*)(AContext->Yarn))->Thread->ThreadID;
bool bTerminated = ((TIdYarnOfThread*)(AContext->Yarn))->Thread->Terminated;
bool bF = ((TIdYarnOfThread*)(AContext->Yarn))->Thread->Finished;
}
ThreadID는 접속한 Telnet의 ThreadID가 맞게 날라오구요...
bTerminated도 true가 된걸로 나옵니다.
bF는 false로 나옵니다.
Thread는 죽지 않고 있습니다.
그리고는,...
Thread Status의 Location이,..
접속 돼있을때는 $77A764D8 이런거 였었는데,..
접속을 끊으면, CPU가 100% 가까이 되면서 $0000053 ..이런걸로 바뀌고 몇 초 뒤에 에러메시지가 뜹니다.
또, 접속을 끊을때 OnExecute에서 catch를 해보면,
"Contection closed gracefully"라는 메시지가 나오는데, 이것을 찾아보니 신경 쓸 부분은 아니더군요.
Indy10은 자동 해제 된다고 들었는데...
접속 해제할때 따로 뭔가를 해줘야 하나요?..ㅠ.ㅠ.;;..
조언 부탁드립니다..
째즈토끼 님이 쓰신 글 :
: 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);
: : }
: : }
: :
: :
: : 조언 부탁드립니다..ㅠ.ㅠ;...
|