|
Button1을 누르지 않고 Button2를 바로 누르면 프로그램이 다운될 것입니다.
thread가 만들어져 있는 지 확인하는 루틴이 없기 때문이지요.
Button2를 한 번 누르면 Com1Th 가 delete 되고 Com1Th는 garbage데이터를 가리키게 됩니다.
그런 상태에서 다시 Button2를 누르게 되면 Com1Th 가 없는 상태에서 Terminate를 호출하려고 하게 되므로 access violation 으로 프로그램이 다운되는 것입니다.
이렇게 해 보세요.
Com1Threa* Com1Th = NULL;
Button1Click 에서
if(! Com1Th)
Com1Th = new ComThread(true);
Button2Click 에서는
if(Com1Th)
{
Com1Th->Terminate();
delete Com1Th;
Com1Th = NULL;
}
이렇게 하면 thread는 하나만 생성이 되고 제대로 파기가 됩니다.
여러개의 thread를 생성할 필요가 있다면 thread의 address를 리스트를 이용한다던지 해서 따로 관리를 해주어야 합니다.
강영준 님이 쓰신 글 :
: file -> new -> Thread Object 루 Thread를 하나 만들고 나서
:
: 메인 폼에서.
:
: Com1Thread* Com1Th;
:
: void __fastcall TForm1::Button1Click(TObject *Sender)
: {
: Com1Th = new Com1Thread(true);
: }
:
: void __fastcall TForm1::Button2Click(TObject *Sender)
: {
: Com1Th->Terminate();
: delete Com1Th;
: }
:
: 이렇게 버튼 1번을 누르면 Thread 실행 2번을 누르면 Thread 종료...
:
: 근데 문제는 실행 버튼인 1번을 연속으로 여러번 누를 경우 여러개의 쓰래드가
:
: 계속 생깁니다.. 그리구 2번 버튼으로 쓰래드를 파기 할경우 한번눌러 준후
:
: 한번더 누르게 되면 프로그램이 다운되어 버립니다.
:
: 물론 여러번 실행 버튼을 눌러 쓰래드를 생성했을경우 종료 버튼을 어려번 눌러 버리면
:
: 프로그램 다운됩니다..
:
: 한번 생성된 쓰래드를 파기 할경우 api 에 보면
:
: ExitThread, TerminateThread 이렇게 두개가 있든데요..
:
: ExitThread 는 관련 DLL등 모두 다 종료를 하고 쓰래드 스스로 파기를 하게끔하고.
:
: TerminateThread 는 급할경우 바로 쓰래드를 종료 해버린다고 설명이 되어 있습니다.
:
: 그렇다면 빌더에서 쓰래드를 생성해서..
:
: 위에처럼 Com1Th->Terminate() 해주면 어떻게 되는건가요?
|