Thread의 Execute 함수 코드를 봐야 원인을 알수 있을듯 한데요
TDataThd 쓰레드의 Execute가 언제 끝나나요?
대게 Thread에서 Execute함수에서
Process의 종료와 thread 자신의 종료 flag를 체크하도록 코딩합니다.
void __fastcall MyThread::Execute()
{
//---- Place thread code here ----
//프로그램의 종료와 thread의 종료 플래그를 종종 체크해야 한다.
while(!Application->Terminated && !this->Terminated)
{
Sleep(10); //thread가 cpu자원을 다쓰지 않도록 .. sleep을 준다.
// 반복한 작업..
작업1
작업2
//GUI를 건드릴 일이 있으면
Synchronize(메소드);
}
}
//---------------------------------------------------------------------------
님께서 만든 TDataThd 의 Execute에서 Read_Data 라는 메소드를 호출한다면?
Read_Data 메소드에서 위와같은 종료를 플레크를 체크해야 할것이구요
Form은 free되었는데.. Read_Data 에서 Form에 있는 어떤 변수나 객체에 접근한다면
access-violation이 날수 밖에 없을것 입니다.
그럼..
memi 님이 쓰신 글 :
:
http://cbuilder.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_tip&no=677
: 팁&트릭에서 김태선님이 작성하신 쓰레드에 함수실어서 잘 사용하고 있습니다~
:
: 그런데 쓰레드가 돌고 있을때 폼클로즈를 해버리면 간혹 이런 핸들 에러나 아래 메시지가 뜨는데..
: ---------------------------
: Debugger Exception Notification
: ---------------------------
: Project DTG.exe raised exception class $C0000005 with message 'access violation at 0x0040573f: read of address 0x000002c8'.
: ---------------------------
: Break Continue Help
: ---------------------------
:
: 쓰레드 생성시 FreeOnTerminate = true; 를 넣어주면 익스큐트가 끝나면 자동으로 해제로 알고있는데...
:
: 창이 닫히면서 쓰레드가 종료되며 메모리 해제가 일어나는지.. 아니면 폼클로즈 이벤트에서 직접 메모리 해제를 해줘야할지..
: 아래처럼 별 시도를 다해봤는데 잘 안되네요 ㅡㅡ;
:
: TDataThd * DataThd;
: void __fastcall TFrm_Main::LV_HeaderDblClick(TObject *Sender)
: {
: DataThd = new TDataThd(&Read_Data, Sender); //생성 ~ 함수시작
: }
: //---------------------------------------------------------------------------
: void __fastcall TFrm_Main::FormClose(TObject *Sender, TCloseAction &Action)
: {
: // if(!DataThd != NULL)
: // if(!DataThd->Suspended)
: // if(!DataThd->Finished)
: // DataThd->Suspend();
: // delete DataThd;
: }