|
흠.. 너무 황당한 마음에 혹시 이런 경험을 하신 분이 계신지 싶어서 질문을 드립니다.
현재 제가 짠 프로그램이 특정 컴에서 쓰레드가 실종(?)이 되어버립니다.
딱히 실종이라고 밖에는 표현이 안되네요.. ㅡㅡ; 아님 자버린다.. ㅠ.ㅠ
현재 프로그램에서 총 3개의 이벤트로 3개의 쓰레드를 제어하고 있습니다.
3개의 이벤트 및 쓰레드는 다음과 같구요...
hAD = CreateEvent(NULL, true, false, NULL); // 수동 리셋 이벤트
hMsg = CreateEvent(NULL, false, false, NULL); // 자동 리셋 이벤트
hDisp= CreateEvent(NULL, true, false, NULL); // 수동 리셋 이벤트
ThdAD = new TADStartThread(false);
ThdAD->Priority = tpLowest;
ThdMsg = new TMsgThread(false);
ThdMsg->Priority = tpNormal;
ThdDisp = new TDisplayThread(false);
ThdDisp->Priority = tpLower;
3개의 쓰레드의 루틴은 대략 다음과 같은 형태입니다.
// hAD 관련
//---------------------------------------------------------------------------
__fastcall TADStartThread::TADStartThread(bool CreateSuspended)
: TThread(CreateSuspended)
{
FreeOnTerminate = true;
}
//---------------------------------------------------------------------------
void __fastcall TADStartThread::Execute()
{
while(!Terminated)
{
WaitForSingleObject(FormMain->hAD, INFINITE);
FormMain->ADStart(); // 이함수에 아래 2개의 쓰레드관련 이벤트가 들어있습니다.
Application->ProcessMessages();
}
}
//---------------------------------------------------------------------------
// hMsg 관련
//---------------------------------------------------------------------------
__fastcall TMsgThread::TMsgThread(bool CreateSuspended)
: TThread(CreateSuspended)
{
FreeOnTerminate = true;
}
//---------------------------------------------------------------------------
void __fastcall TMsgThread::Execute()
{
while(!Terminated)
{
WaitForSingleObject(FormMain->hMsg, INFINITE);
Synchronize(Update);
}
}
//---------------------------------------------------------------------------
// hDisp 관련
//---------------------------------------------------------------------------
__fastcall TDisplayThread::TDisplayThread(bool CreateSuspended)
: TThread(CreateSuspended)
{
FreeOnTerminate = true;
}
//---------------------------------------------------------------------------
void __fastcall TDisplayThread::Execute()
{
while(!Terminated)
{
WaitForSingleObject(FormMain->hDisp, INFINITE);
Synchronize(Display);
}
}
//---------------------------------------------------------------------------
그런데 이넘의 쓰레드가 이벤트를 받아서 루틴을 수행하다가는 실종이 되어버립니다.
실종된 쓰레드의 루틴을 제외한 나머지 2개의 쓰레드 및 메인 루틴은 반응도 하고, 아주 정상적으로 동작을 합니다.
그런데 실종된 쓰레드는 어떤 에러메시지도 없이 그냥 묵묵무답 조용합니다.
수동리셋이벤트의 경우, 루틴중간에 실종되다보니 이벤트 리셋도 안되구요,
자동리셋이벤트의 경우도, 분명 다른루틴에서 이벤트를 발생을 시키는데, 동작을 하질 않습니다.
그냥 해당 이벤트 및 쓰레드 루틴이 실종됐다고 밖에는...
CPU 로드도 안걸리니, 무한루프도 아니고... 불특정 상황에서 그냥 조용히 사라집니다(자버립니다).
너무 황당하고 답답해서 말도 안되는 질문을 올려봅니다.
혹시 이런상황을 겪어보신 분이나, 이런 상황이 발생할 지도 모르기 때문에 피해야 되는 조건이나... 등등
조언을 주실분을 찾습니다..
|