|
정확한 코딩 의도는 알 수 없지만 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
: 이거거든요? 아마 이거와 연관이 있는듯 하네요 ^^;
: 오류를 찾아서 정상적으로 실행할 수 있게 고수님들의 조언 부탁합니다. ^^
:
|