안녕하세요!
쓰레드 관련해서 이해가 안되는 부분이 있어 질문 드립니다...
현재 프로그램 종료할때 윈도우 XP 에서는 문제가 되지 않는 부분이 윈도우 7에서는 정상적으로 종료가 되지 않아
문제점을 찾는데 이해가 되지 않는 부분이 있습니다..
해제 시킬때 FreeOnTerminate = true로 설정 했으면 Free() 함수를 할 필요가 없는데
Free()함수를 해서 그런걸까요..?
운영체제에 따른 차이가 발생한다는 점이 이해가 안되는 부분입니다...
소스를 수정하여 정상적으로 종료되게끔 하였으나 의문점이 남아 있어 찜찜하네요
고견 부탁드립니다!
빌더6.0으로 작성한 코드 입니다..
//문제가 되는 소스 코드
__fastcall TUserThread::TUserThread(TComponent *Owner) : TComponent(Owner)
{
m_Enabled = false;
m_Interval = 100;
m_Resolution = 100;
m_Paused = false;
m_TimerEvent = (THandle) CreateEvent(NULL, FALSE, FALSE, NULL);
Priority = tpTimeCritical;
m_Interval = 1; // [ms]
m_Resolution = 1;
SetEnabled(true);
}
__fastcall TUserThread::~TUserThread(void)
{
CloseHandle((void*)m_TimerEvent);
SetEnabled(false);
}
void __fastcall TUserThread::SetEnabled(bool Value)
{
if(Value)
{
m_TimerThread = new TTimerThread(this, true);
m_TimerThread->Priority = m_Priority;
m_TimerThread->FreeOnTerminate = true;
m_TimerThread->Resume();
CreateTimer();
}
else
{
timeKillEvent(m_ID);
TerminateThread((void*)m_TimerThread->Handle, 0);
m_TimerThread->Free(); // 이부분에서 메모리 관련 에러 발생
}
}
//수정 소스
__fastcall TUserThread::~TUserThread(void)
{
Enabled = false;
}
//---------------------------------------------------------------------------
void __fastcall TUserThread::SetEnabled(bool Value)
{
if(Value)
{
m_TimerThread = new TTimerThread(this, true);
m_TimerThread->Priority = m_Priority;
m_TimerThread->FreeOnTerminate = false;
m_TimerThread->Resume();
CreateTimer();
}
else
{
if(m_ID)
timeKillEvent(m_ID);
if(m_TimerEvent)
CloseHandle((void*)m_TimerEvent);
delete m_TimerThread;
}
}
|