|
빌더매니아 님이 쓰신 글 :
: 앞서 검색한 글에 임프님의 글을 읽으니, 한번 쓰레드를 terminate하고 delete하면 execute method가 종료되어 다시 생성하는 방법은 없다고 읽었습니다.
:
: void __fastcall TMainFrame::StartClick(TObject *Sender)
: {
:
: Scan = new Scanning(false);
:
: }
:
:
: void __fastcall TMainFrame::AbortClick(TObject *Sender)
: {
:
: Scan->Terminate();
: Scan->WaitFor();
: Scan = NULL; // 순서가 바뀌었음
: delete Scan; // 순서가 바뀌었음
Scan에 NULL을 넣구 delete를 하면...
당연히 Scan이 안지워지겠죠.
delete를 먼저하고 NULL을 넣어야 합니다.
꼭 스레드 포인터를 얻어야하는 상황이 아니라면,
스레드 생성자에서 FreeOnTerminate = true;를 지정해주면
스레드가 종료되면 자동으로 소멸하게 됩니다.
그리고 Terminate() 함수는 Terminated 값을 true로 셋팅하는
작업 밖에 안하기 때문에, 스레드가 Suspended 상태라면
스레드가 절대 종료되지 않기 때문에 WaitFor()에서 무한 루프가
걸려버립니다.
Terminate() 함수 호출 이전에 반드시
if( Scan->Suspended ) Scan->Resume(); 문장이 포함되어야 겠죠.
좋은 프로그램 짜시기 바랍니다 ^^
:
: }
:
: 지금 이런 형국으로 Start버튼으로는 쓰레드 생성을, Abort버튼으로는 소멸을 하고 있지요.
: suspend나 resume 메소드는 일시정지기능으로 이미 사용하고 있구요,
:
: 반드시 쓰레드를 소멸하고 비트맵 픽셀수를 재조정하고(지금 쓰레드로 비트맵에 라인 긋고 있거든요, 라인이 맨 아래부터 차곡차곡 쌓이죠~) 다시 쓰레드를 실행하고 싶은데요(즉 새 비트맵위에 처음부터 다시 그리고 싶은데요), 임프님 말씀대로 Abort버튼 누르고 다시 Start버튼 누르면 에러가 나네요. 어플리케이션을 종료하고 다시 시작해서 하면 되고요 --;
:
: goto문등 갖은 꽁수를 써도 잘 안됩니다.
: 쉽게 생각하면 완전히 메모리까지 해제했는데도 왜 다시 생성이 안되는지 의아합니다.
: 좋은 방법 없을까요 고수님들~
|