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
[41461] Re:해결 보았습니다
evergreen [heredity] 1664 읽음    2005-08-14 13:01
안녕하세요. 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(); 와 같은 함수를 사용하도록 하니
: 지금까지 쓰레드 때문에 문제 생기지 않았습니다.
:
: 마우튼 답변 감사드립니다.

+ -

관련 글 리스트
41423 쓰레드 생성 후 종료 문제 입니다. ☆~ 1212 2005/08/11
41430     Re:쓰레드 생성 후 종료 문제 입니다. smleelms 1839 2005/08/11
41457         해결 보았습니다 ☆~ 1247 2005/08/14
41461             Re:해결 보았습니다 evergreen 1664 2005/08/14
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.