|
안녕하세요. 조언좀 구하고 싶어서 글을 올립니다.
쓰레드를 실행시켜 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;
}
//-----------------------------------------------------------------------
|