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
[28252] Re:혹시 쓰레드가 실종(?)되는 상황을 겪어보신분..
박지훈.임프 [cbuilder] 1484 읽음    2003-12-18 11:13
쓰레드에 주의하실 점..

1. 쓰레드 내부, 정확하게는 Execute() 함수 내부에서는 Application->ProcessMessages()를 호출하면 절대로!
안됩니다. 쓰레드가 죽어버립니다. 아마 문제가 발생한 주 원인이 바로 이것일 겁니다. 구체적으로 안되는
이유를 알고 싶으시면 TThread 클래스의 내부 소스를 참조하세요.

2. 폼의 멤버함수를 실행할 때는 거의 대부분 Synchronize()를 써야 한다고 생각해두시는 것이 좋습니다.
물론 해당 멤버함수가 문제가 없을 수도 있지만, 아무래도 피하시는 것이 좋습니다.

그럼...


smleelms 님이 쓰신 글 :
: 흠.. 너무 황당한 마음에 혹시 이런 경험을 하신 분이 계신지 싶어서 질문을 드립니다.
:
: 현재 제가 짠 프로그램이 특정 컴에서 쓰레드가 실종(?)이 되어버립니다.
: 딱히 실종이라고 밖에는 표현이 안되네요.. ㅡㅡ; 아님 자버린다.. ㅠ.ㅠ
:
: 현재 프로그램에서 총 3개의 이벤트로 3개의 쓰레드를 제어하고 있습니다.
:
: 3개의 이벤트 및 쓰레드는 다음과 같구요...
:
:     hAD  = CreateEvent(NULL, true, false, NULL);    // 수동 리셋 이벤트
:     hMsg = CreateEvent(NULL, false, false, NULL);    // 자동 리셋 이벤트
:     hDisp= CreateEvent(NULL, true, false, NULL);    // 수동 리셋 이벤트
:
:     ThdAD = new TADStartThread(false);
:     ThdAD->Priority = tpLowest;
:
:     ThdMsg = new TMsgThread(false);
:     ThdMsg->Priority = tpNormal;
:
:     ThdDisp = new TDisplayThread(false);
:     ThdDisp->Priority = tpLower;
:
:
: 3개의 쓰레드의 루틴은 대략 다음과 같은 형태입니다.
:
: // hAD 관련
: //---------------------------------------------------------------------------
: __fastcall TADStartThread::TADStartThread(bool CreateSuspended)
:     : TThread(CreateSuspended)
: {
:     FreeOnTerminate = true;
: }
: //---------------------------------------------------------------------------
: void __fastcall TADStartThread::Execute()
: {
:     while(!Terminated)
:     {
:         WaitForSingleObject(FormMain->hAD, INFINITE);
:
:         FormMain->ADStart(); // 이함수에 아래 2개의 쓰레드관련 이벤트가 들어있습니다.
:
:         Application->ProcessMessages();
:     }
: }
: //---------------------------------------------------------------------------
:
:
: // hMsg 관련
: //---------------------------------------------------------------------------
: __fastcall TMsgThread::TMsgThread(bool CreateSuspended)
:     : TThread(CreateSuspended)
: {
:     FreeOnTerminate = true;
: }
: //---------------------------------------------------------------------------
: void __fastcall TMsgThread::Execute()
: {
:     while(!Terminated)
:     {
:         WaitForSingleObject(FormMain->hMsg, INFINITE);
:         Synchronize(Update);
:     }
: }
: //---------------------------------------------------------------------------
:
:
: // hDisp 관련
: //---------------------------------------------------------------------------
: __fastcall TDisplayThread::TDisplayThread(bool CreateSuspended)
:     : TThread(CreateSuspended)
: {
:     FreeOnTerminate = true;
: }
: //---------------------------------------------------------------------------
: void __fastcall TDisplayThread::Execute()
: {
:     while(!Terminated)
:     {
:         WaitForSingleObject(FormMain->hDisp, INFINITE);
:         Synchronize(Display);
:     }
: }
: //---------------------------------------------------------------------------
:
:
: 그런데 이넘의 쓰레드가 이벤트를 받아서 루틴을 수행하다가는 실종이 되어버립니다.
: 실종된 쓰레드의 루틴을 제외한 나머지 2개의 쓰레드 및 메인 루틴은 반응도 하고, 아주 정상적으로 동작을 합니다.
: 그런데 실종된 쓰레드는 어떤 에러메시지도 없이 그냥 묵묵무답 조용합니다.
:
: 수동리셋이벤트의 경우, 루틴중간에 실종되다보니 이벤트 리셋도 안되구요,
: 자동리셋이벤트의 경우도, 분명 다른루틴에서 이벤트를 발생을 시키는데, 동작을 하질 않습니다.
: 그냥 해당 이벤트 및 쓰레드 루틴이 실종됐다고 밖에는...
:
: CPU 로드도 안걸리니, 무한루프도 아니고... 불특정 상황에서 그냥 조용히 사라집니다(자버립니다).
:
:
: 너무 황당하고 답답해서 말도 안되는 질문을 올려봅니다.
: 혹시 이런상황을 겪어보신 분이나, 이런 상황이 발생할 지도 모르기 때문에 피해야 되는 조건이나... 등등
: 조언을 주실분을 찾습니다..

+ -

관련 글 리스트
28249 혹시 쓰레드가 실종(?)되는 상황을 겪어보신분.. smleelms 776 2003/12/17
28252     Re:혹시 쓰레드가 실종(?)되는 상황을 겪어보신분.. 박지훈.임프 1484 2003/12/18
34162         Re:Re:혹시 쓰레드가 실종(?)되는 상황을 겪어보신분.. smleelms 1052 2003/12/18
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.