|
프로그램 내부에 문제가 발생되면 Thread가 죽어버립니다.
while 구문을 try catch 로 감싸서 catch 에서 exception 내용을 확인해보세요.
newhuni 님이 쓰신 글 :
: 안녕하세요. 조언좀 구하고 싶어서 글을 올립니다.
:
: 쓰레드를 실행시켜 PLC와 통신을 하여 데이타를 읽어오는 프로그램을 작성했습니다.
: 문제는 겉보기에는 잘 동작하는데 중간에 쓰레드만 죽어버리는 현상이 발생합니다.
:
: 아래 코드에서 "여기(1)" 부분 말고는 쓰레드를 Terminate()시키는 코드가 소스에서 존재하지 않습니다.
: 그리고 쓰레드에서 PLC와 통신하다 문제가 발생하면 다시 PLC와 통신을 시도하는 함수 타이머를 Enable시키고
: 쓰레드를 종료합니다.
:
: 그런데... 통신 재연결 타이머도 실행되지 않은 상태에서 쓰레드가 죽어버리는 현상이 발생합니다.
: 에러메시지도 발생하지 않고 프로그램을 처음 실행하면 잘 동작하다 어느순간 쓰레드만 죽어버리는 것 같습니다.
: 어떤 경우에 프로그램을 실행되고 쓰레드만 죽을 수 있을까요?
: 만약 이런일이 발생되면 어떻게 예외처리를 할 수 있을까요? 쓰레드를 계속 감시해야 하나요?
:
: 고수님의 조언 부탁드립니다.
:
: //-----------------------------------------------------------------------
: __fastcall TReadData::TReadData(bool CreateSuspended)
: : TThread(CreateSuspended)
: {
: FreeOnTerminate = true; // 쓰레드 자동 메모리 해제
: }
: //-----------------------------------------------------------------------
: void __fastcall TReadData::Execute()
: {
: while(!Application->Terminated && !this->Terminated)
: {
: WaitForSingleObject(NULL, 2000); // 2초간 지연
: if(ReadData() == false){ // 통신 끊기면 쓰레드 종료
: this->Terminate(); // <---- 여기(1)
: }
: }
: }
: //-----------------------------------------------------------------------
: bool __fastcall TReadData::ReadData()
: {
: for(int i=0;i<100;i++)
: {
: :
: : (작업수행)
: :
: if(PLC와의 통신 연결 실패시)
: {
: // PLC와의 통신 재연결 함수 호출 타이머 작동 후 리턴
: return false;
: }
: }
: return true;
: }
: //-----------------------------------------------------------------------
:
|