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
[24246] Re:쓰레드 CriticalSection알고리즘인뎅.. 질문요
임문환 [mhlim] 808 읽음    2003-02-12 16:31

정확한 코딩 의도는 알 수 없지만 Execute 매서드 내의 while 루프가 이상합니다.
스레드가 실행 중인 동안에는 계속 while 루프를 도는데 거기서 하는 일이 게이지의 위치를 0으로 설정하는 것이군요.
스레드가 종료되는 시점에야 잠깐 for 루프 내의 코드들이 실행되구요.


그리고, while 루프 안에는 Application->ProcessMessages();를 넣어 주는 것이 좋습니다.
그것도 아니면 스레드의 우선 순위를 낮추시든지요(Priority = tpLower;)


이윤수 님이 쓰신 글 :
: 헤더부분 ----------------------------------------------------------------------------------
: -------------------------------------------------------------------------------------------
: class TScreenThread : public TThread
: {
:         private:
:                 int GaugeNum; //게이지 쓰레드에 대해 번호 부여를 위해
:                 void __fastcall Execute(void);
:                 void __fastcall UpdateThread(void); //쓰레드가 업데이트되도록 메소드 선언
:         public:
:                 __fastcall TScreenThread(int TheNum); // 쓰레드 생성자 선언
: };
:
: 소스부분 -----------------------------------------------------------------------------------
: --------------------------------------------------------------------------------------------
: CRITICAL_SECTION CriticalSection;
: //---------------------------------------------------------------------------
: __fastcall TForm1::TForm1(TComponent* Owner)
:         : TForm(Owner)
: {
: }
: //---------------------------------------------------------------------------
: __fastcall TScreenThread::TScreenThread(int TheNum):TThread(true)
: {
:         FreeOnTerminate = true;
:         GaugeNum = TheNum;
:         Resume();
: }
: //---------------------------------------------------------------------------
: void __fastcall TScreenThread::Execute(void)
: {
:  while(!Terminated)
:  {
:   Form1->CGauge1->Progress = 0;
:   Form1->CGauge2->Progress = 0;
:   Form1->CGauge3->Progress = 0;
:  }
:
:  for (int x=0;x<100 ;x++)
:  {
:   EnterCriticalSection(&CriticalSection);
:   UpdateThread();
:   LeaveCriticalSection(&CriticalSection);
:  }
: }
: //---------------------------------------------------------------------------
: void __fastcall TScreenThread::UpdateThread(void)
: {
:  switch (GaugeNum){
:   case 0: Form1->CGauge1->Progress++; break;
:   case 1: Form1->CGauge2->Progress++; break;
:   case 2: Form1->CGauge3->Progress++; break;
:  }
: }
: //---------------------------------------------------------------------------
: void __fastcall TForm1::Button1Click(TObject *Sender)
: {
:         TScreenThread *T;
:         for (int i=0;i<3 ;i++){
:          T = new TScreenThread(i);
:         }
:
: }
: //---------------------------------------------------------------------------
:
: void __fastcall TForm1::FormCreate(TObject *Sender)
: {
:         InitializeCriticalSection(&CriticalSection);       
: }
: //---------------------------------------------------------------------------
:
: void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
: {
:         DeleteCriticalSection(&CriticalSection);
: }
: //---------------------------------------------------------------------------
:
:
: 쓰레드 구현을 위해 책을 보고 그대로 해 봤는데 잘 안되더군요. 쓰레드는 디버거로 보니
: 생성되는거 같은데 실질적인 기능 실행이 안되네요. 제 생각에는 TScreenThread정의하는 부분의
: Resume() 에서 Execute함수로 넘어가야 올바른 기능이 실행될거 같은데 잘 안되네요.
:
: 쓰레드를 통해 구현되는 기능은 CGauge컴포넌트의 게이지 세개가 쓰레드를 통해 돌아가는 겁니다.
: 컴파일하면 warning메시지가 뜨는데
: [C++ Warning] ThreadCriticalSectionF.cpp(59): W8004 'T' is assigned a value that is never used
: 이거거든요? 아마 이거와 연관이 있는듯 하네요 ^^;
: 오류를 찾아서 정상적으로 실행할 수 있게 고수님들의 조언 부탁합니다. ^^
:

+ -

관련 글 리스트
24236 쓰레드 CriticalSection알고리즘인뎅.. 질문요 이윤수 767 2003/02/12
24246     Re:쓰레드 CriticalSection알고리즘인뎅.. 질문요 임문환 808 2003/02/12
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.