|
안녕하세요. heredity입니다.
올려주신 프로그램(C++ Builder의 Version이 다름(?))이나 임프님의 쓰레드(어디에 있나요 ?)을
확인하지 않고 쓴 글이라 적절하지 않을 수도 있지만... 걍 참조만 하세요. ㅎㅎㅎ
TThread의 Terminate()는 Thread의 종료 여부를 검사하는 Porperty인 Terminated가
true를 return하도록 변수에 값을 설정하는 기능을 할 뿐 입니다.
즉, Execute()에서
while !Terminated
{
// 처리 코드
}
와 같이 되어 있을 때
ThreadVar->Terminate();
를 호출하면 Terminated는 true를 반환하게 되어 while문을 빠져 나오면서 Thread가
종료하게 되는 거죠(당연한 사실이지만... ^^)
하지만 Execute()의 코드가 아래와 같다면
while !Terminated
{
// 처리코드 1 (할당된 메모리 처리부 1)
// 처리코드 2 (할당된 메모리 처리부 2)
}
::Sleep( 1000 );
// 처리코드 3(할당된 메모리 처리부 2)
Thread를 종료시키기 위해 아래와 같이 작성했을 때
ThreadVar->Terminate(); // ThreadVar은 Thread Object.
ThreadVar->WaitFor(); // ① Thread가 종료하길 기다림.
할당된 메모리 2 해제 처리부 // ②
할당된 메모리 1 해제 처리부 // ②
WaitFor()로 해당 Thread가 종료되길 기다리지 않는다면(① 부분)
'할당된 메모리 n 해제 처리부'(② 부분)가 Thread의 종료보다 먼저 일어나
종료하지 않은 Thread내에서 해제된 메모리를 참조하는 오류를 범하게
될 것 입니다.(Access Violation 오류 등이 발생할 것입니다.)
행복하세요.
☆~ 님이 쓰신 글 :
: 답변 감사합니다.
: 임프님의 방법으로 생성한 쓰레드는 종료검사를 WaitForSingleObject하면 않되겠더군요..
:
: 종료를 기다리는 측에서
: ImpThread -> Terminate();
: 와 같이 검사하니 잘 됩니다.
: 제가 지금까지 쓴 방법은
:
: 종료를 기다리는 측은
: WaitForSingleObject
: 함수로 종료를 대기하고 쓰레드 함수 내에서
: Terminate();
: 를 사용했습니다.
:
: 정확이 왜 저렇게 하면 오작동을 하는지 모르겠으나
: 현제는 쓰레드 내에서 Terminate(); 를호출하지 않으며 대신 종료를 기다리는 측에서
: WaitForSingleObject 대신 ImpThread -> Terminate(); 와 같은 함수를 사용하도록 하니
: 지금까지 쓰레드 때문에 문제 생기지 않았습니다.
:
: 마우튼 답변 감사드립니다.
|