프로그램은 제가 짠것이 아니고 이전에 담당자가 짜놓은 것인대....
프로그램 쌩판 모르는 이놈이 이것 저것 수정하려다보니....
여기 저기 태클거는게 한두개가 아니네요...ㅠ.ㅠ
답변정말 감사드립니다... (__)
아제나 님이 쓰신 글 :
: FreeOnTerminate를 true 지정하고,
:
: Execute 종료시에 메모리를 삭제해버리니까,
:
: delete VoltThread;
:
: 스레드가 끝나면 VCL 내부에서 자신을 삭제하려고 시도하는데,
: 지워서 없는 메모리를 또 지우려고 하니까 에러가 발생하는 것이네요.
:
: 전체적인 TThread의 사용법을 다시 공부하시는 것을 권해드리고요.
:
: 질문과는 관련 없지만, 스레드 생성할 때, Suspend 값은 상속시에 전달해주려고 하는 것인데,
: TThread 생성자 부르면서 (false)로 지정을 해놓으셨으니, 의미 없는 코드네요.
:
: 그리고 Execute 루프 유지는 TThread에 이미 마련되어 있는 Terminated 맴버 변수를 통하여 하는 것이 좋습니다.
: VoltThreadFlag도 의미가 없죠. VoltThreadFlag 처럼 스레드 내부에서 쓰이는 값을 스레드 외부에서 마구 쓰시면 메모리 동시 접근 문제(CriticalSection 관련 오류)를 발생시키게 됩니다.
:
: 수정하면 이런식으로 되겠군요.
:
:
:
: class TVoltThread : public TThread
: {
: private:
: protected:
: void __fastcall Execute();
: public:
: __fastcall TVoltThread();
: };
:
: __fastcall TVoltThread::TVoltThread()
: : TThread(false)
: {
: FreeOnTerminate = true;
: }
:
: void __fastcall TVoltThread::Execute()
: {
: while( !Terminated )
: {
: // Do Something
: }
:
: // Terminate(); 의미 없음
: // delete VoltThread; // 중복 삭제를 일으키는 에러 원인
: }
:
: // 사용법
: void __fastcall TForm1::Button1Click(TObject *Sender)
: {
: TVoltThread *newThread = new TVoltThread();
:
: newThread->Terminate(); // 스레드 종료
: newThread->WaitFor(); // 스레드가 실제로 종료되는 시각까지 대기 (FreeOnTerminate True가 아니면 중요)
:
: // 별도의 Thread 메모리 해제 처리는 필요 없음
: }
:
:
:
:
:
: 돗대리아 님이 쓰신 글 :
: :
: :
: :
: :
우선 아래의 코드는 멈추는 시점이 "이곳" 이어서 그에 해당되는 코드를 모두 적어보았습니다.
문제가 발생되는 내용은 아래와 같습니니다.
Project FPD_OLP_TEST.exe raised exception class EAccessViolation with message
'Access violation at address 7C948FEA in module 'ntdll.dll', Write of address
00000010', Process stopped, Use Step or Run to continue
윈도우를 새로 설치 한 후 이런 문제가 발생됩니다.
이곳 저곳 디져봤지만 메모리쪽 문제라고들 말씀하시는대요...
초보라 메세지만 봐서는 문제를 찾을수가 없어 도움 요청드립니다.
해결 방법좀 알려주세요...
부탁드립니다. (_ _)
: :
: :
해더 선언부 ===========================================================
class TVoltThread : public TThread
{
private:
protected:
void __fastcall Execute();
public:
__fastcall TVoltThread(bool CreateSuspended);
};
소스코드 ==============================================================
__fastcall TVoltThread::TVoltThread(bool CreateSuspended)
: TThread(false)
{
FreeOnTerminate = true;
Resume();
}
void __fastcall TVoltThread::Execute()
{
while(VoltThreadFlag==true)
{
.
.
.
.
}
Terminate();
delete VoltThread;
}
void __fastcall TMainForm::FormCreate(TObject *Sender)
{
VoltThreadFlag=true;
VoltThread = new TVoltThread(true); <===============이곳
.
.
.
: :
}
: :