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
[74835] 쓰레드 해제 관련 문의 드립니다.
조롱이 [] 3066 읽음    2018-03-26 10:31
안녕하세요!
쓰레드 관련해서 이해가 안되는 부분이 있어 질문 드립니다...
현재 프로그램 종료할때 윈도우 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;
        }
}

+ -

관련 글 리스트
74835 쓰레드 해제 관련 문의 드립니다. 조롱이 3066 2018/03/26
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.