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
[14984] Re:[질문]쓰레드 관리하는 방법 좀 갈켜주세요.
홍성원 [hsweon] 1809 읽음    2002-01-25 10:42
초보 빌더 사용자 님이 쓰신 글 :
: 안녕하세요..
:
: 제가 쓰레드를 만들어서 프로그램을 하는데 시작버튼을 누르면 쓰레드가 20개가
: 만들어져요..그리고 멈춤버튼을 누르면 만들었던 20개 쓰레드를 바로 제거하고 싶거든요.
:
: 그리고 프로그램을 종료하면 쓰레드가 잇으면 다시 제거하고 난 후, 프로그램을 종료하고
: 싶은데. 잘 안되네요.
:
: 책에서는 TThreadList로 생성된 쓰레드 객체를 저장하고 난후, Terminate명령을 주던데
: 그렇게 하면..바로 죽지가 않앙요...그거는 쓰레드의 샐행부분에 제가
: 시간지연을 좀 주거든요. 그래서 인지 그 시간 지연 함수로 들어가버리면,,,그일 다음에 할 일을 다하고 난 후에나 쓰레드가 멈추더라구요.
: 그런데 그 주기를 1시간라고 하면 한시간동안 안 죽을거 아닌가요?
: ㅡ,ㅡ
: 그래서 바로 죽일 수 있는 함수가 있을 듯 한데 어떻게 사용하는지요.
: 그리고 나갈때 바로 Terminate시키니깐 프로그램이 비정상적으로 종료되었다고 난리가 아니네요.
:
: 말이 길어졌는데 쓰레드를 만들고 쓰레드를 마음대로 없애고 쓰레드에게 제가 원하는 메세지를
: 보낼 수 있는 방법이 없나요?
:
: CThread *T;
: int i;
:
: for (i=0;i<20;i++)
:   {
:   T = new CThread(false);
:   CThreadList->Add(T);
:   }
: 이런식으로 20개의 쓰레드를 생성해 리스트에 넣었습니다.
: 그리고 아래처럼 죽이고 있는데...잘안되네요.
:
:
: TThreadList CThreadList;
: reinterpret_cast<CThread*>(CThreadList->Items[i])->Terminate();
: reinterpret_cast<CThread*>(CThreadList->Items[i])->WaitFor();
:
: 이런식으로 종료를 하는데 잘 안되네요.
:
: 실행부분엔 시간 지연 함수가 들어가 있어요.
:
: void __fastcall CThread::delay1(float msec)
: {
:   long StartTime, EndTime, ElapseTime;
:   DWORD timeout = (msec*1000UL) + GetCurrentTime();
:
:    while(GetCurrentTime() < timeout)
:    {
:       Application->ProcessMessages();
:       if (Terminated) ExitThread(0);
:    }
:
: }
:
: 이런 식의 함수...
:
:   while(!Terminated)
:   {
:     delay1(30);
:     Synchronize(AddData);
:   }
:      
: 여기서 30초 딜레이 시키니깐 Terminate()함수를 호출해도 delay1()루틴으로 들어가면 어쨌거나
: Synchronize()까지는 자동으로 가네요...전 그전에 죽이고 싶어요..그래서 시간지연함수에
: ExitThread(0);을 넣었는데 별 도움이 안돼네요...제가 체계가 없어서 이것저것 다해보고 있는데
: 고수님들이 답변부탁합니다.
:    


  글세요!
    스레드를 죽이는 방법은 2가지가 있는데요!
    하나는 님께서 하신것처럼 ExitThread(0)을 주는 방법과
    TerminateThread(..) 방법이 있습니다. 전자는 님께서 경험하신것처럼 자기할일을 다하고 종료
    하고  후자는 강제로 빼버리는 건데 정말 다급한일아니면 조금 위험하죠(메모리등...)
    그래서 보통 스레드 종료는 전역변수를 감시해서 작업스레드에서 빠져나오게 합니다.
    님의 프로그램이면
     여기서   while(!Terminated)
              {
                 delay1(30); <--- 이함수의 return 값을 받아서 delay함수 도중에 종료명령(?)이
                                  오면 밑의 Synchronize(AddData)을 수행하지 않고 break을 하시
                                  든 if ~ else로 수행을 하지 않고 while문을 탈출하시던...
                 Synchronize(AddData);
              }
    수고하세요!!!

+ -

관련 글 리스트
14957 [질문]쓰레드 관리하는 방법 좀 갈켜주세요. 초보 빌더 사용자 1117 2002/01/24
14984     Re:[질문]쓰레드 관리하는 방법 좀 갈켜주세요. 홍성원 1809 2002/01/25
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.