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
[25708] Re:[질문] TThread 관련 질문입니다..
Julien [julien] 751 읽음    2003-05-22 11:54
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() 해주면 어떻게 되는건가요?

+ -

관련 글 리스트
25707 [질문] TThread 관련 질문입니다.. 강영준 658 2003/05/22
25708     Re:[질문] TThread 관련 질문입니다.. Julien 751 2003/05/22
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.