C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[57253] Re:ntdll.dll 에러 해결방법좀 알려주세요....ㅠ.ㅠ
아제나 [azena] 5358 읽음    2009-06-15 11:23
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);  <===============이곳   
   .
   .
   .

:

}

:



 


+ -

관련 글 리스트
57238 ntdll.dll 에러 해결방법좀 알려주세요....ㅠ.ㅠ 돗대리아 3384 2009/06/13
57253     Re:ntdll.dll 에러 해결방법좀 알려주세요....ㅠ.ㅠ 아제나 5358 2009/06/15
57262         답변정말 감사드립니다...^^' 돗대리아 2359 2009/06/15
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.