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
[58781] Re:Re:Re:[긴급]TCP 에서 쓰레드 이용시 Terminate() 가 안돼요 ㅠ
장성호 [nasilso] 1429 읽음    2009-10-14 18:50
thread->Terminate(); 하면 그냥 쓰레드가  스스로 종료하도록
TThread의 멤버 변수를 true시켜줄 뿐입니다.

TThread에서는 그 멤버변수를 보고 알아서 종료해야죠

만약 Thread를 일시정지 시켰다가 다시 동작시키려면

Thread->Suspend();

Thread->Resume(); 같은 함수를 이용하면 될것입니다.

그리고
Thread의 Terminated프로퍼티는 protected입니다.
기본적으로는 다른 class나 밖에서 다음과 같이 수정할수 없습니다.
thread1->Terminated = false;


TThread를 수정하여 저렇게 만든다면...
스스로 종료하기 전에 다시 Terminated변수를 false시키면
종료되진 않겟죠
하지만 이런식으로 코딩하는것을 본적이 없네요

그럼..


정민채 님이 쓰신 글 :
: 쓰레드를 대기 상태로 만드는건가요?
: 그렇다면.. 다시 실행하게 할려면..
: thread1->Terminated = false;
: thread2->Terminated = false;
: 상태로 만들면 다시 돌아갈려나요?? ㅡ0ㅡ?
:
:
: 장성호 님이 쓰신 글 :
: :
: : thread1.execute() 
: : { 
: :       while(1) 
: :       { 
: :          회선 점검용 데이터 전송... 
: :           if(서버가 응답이 없을때) 
: :           { 
: :               closesocket(소켓); 
: :               thread2->Terminate(); 
: :               return;        
: :           } 
: :       } 
: : } 
: : 
: : thread2.execute() 
: : { 
: :      while(1) 
: :       { 
: :          데이터 처리.. 
: :       } 
: : } 
: : 

: :
: : 위와같이 하면 안됩니다.
: :
: : TThread의 Terminate함수는 단지 TThread의  bool형 멤버필드인  FTerminated 를 true로 바꿔줄뿐입니다.
: :
: :
: : thread1.execute() 
: : { 
: :       while(! this->Terminated) //이렇게 해야..
: :       { 
: :          회선 점검용 데이터 전송... 
: :           if(서버가 응답이 없을때) 
: :           { 
: :               closesocket(소켓); 
: :               thread2->Terminate(); 
: :               return;        
: :           } 
: :       } 
: : } 
: : 
: : thread2.execute() 
: : { 
: :      while(! this->Terminated) //이렇게 해야..
: :       { 
: :          데이터 처리.. 
: :       } 
: : } 
: : 

: :
: : 위와같이 Terminated 필드가 true가 아닐때만 while문을 돌려야 합니다.
: : 그것이 아니라면 win32 api를 써서 강제로 Thread를 terminated할수는 있지만...
: : 문제가 발생할 가능성이 여러가지가 있으니..
: :
: : 위와같이 해서 쓰레스 스스로 알아서 terminated되도록하는것이 정석입니다.
: :
: : 그럼..
: :
: :
: : 정민채 님이 쓰신 글 :
: : : 아.. 무쟈게 고생하고 있습니다 ㅠㅠ;
: : : 이렇게 하면 될듯도 하지만 도무지 되지가 않는군요
: : :
: : : TCP client 를 만들고 있습니다.
: : : thread1 : 회선 점검용 쓰레드
: : : thread2 : 회선 점검 이외의 데이터 처리 쓰레드
: : :
: : : main()
: : : {
: : :     if(TCPopen())
: : :     {
: : :        thread1 생성;
: : :        thread2 생성;
: : :
: : :        while(flag){}
: : :     }
: : : }
: : :
: : : thread1.execute()
: : : {
: : :       while(1)
: : :       {
: : :          회선 점검용 데이터 전송...
: : :           if(서버가 응답이 없을때)
: : :           {
: : :               closesocket(소켓);
: : :               thread2->Terminate();
: : :               return;       
: : :           }
: : :       }
: : : }
: : :
: : : thread2.execute()
: : : {
: : :      while(1)
: : :       {
: : :          데이터 처리..
: : :       }
: : : }
: : :
: : : 위와 같이 구성했는데요.. 문제는 서버를 죽였다가 살리면...
: : : thread1, thread2에 ID값이 NULL 이여야 다시 생성하고 동작할텐데.
: : : 쓰레드에 ID값이 들어있군요 ㅠㅠ;
: : : 아!!! 이론상 완벽할듯 한데 ㅠㅠ;; 역시 내공이 부족하여 ㅠㅠ;
: : : 답변 꼭좀 부탁드려요 ㅠㅠ;;; 추천하시는 방법이라던지 ㅠㅠ;
: : : 지푸라기라도 잡고 싶은 심정입니다 ㅠㅠ;;

+ -

관련 글 리스트
58775 [긴급]TCP 에서 쓰레드 이용시 Terminate() 가 안돼요 ㅠ 정민채 1029 2009/10/14
58777     Re:[긴급]TCP 에서 쓰레드 이용시 Terminate() 가 안돼요 ㅠ 장성호 985 2009/10/14
58778         Re:Re:[긴급]TCP 에서 쓰레드 이용시 Terminate() 가 안돼요 ㅠ 정민채 974 2009/10/14
58781             Re:Re:Re:[긴급]TCP 에서 쓰레드 이용시 Terminate() 가 안돼요 ㅠ 장성호 1429 2009/10/14
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.