|
볼랜드 포럼에서 항상 좋은 정보만 얻어가다가, 처음으로 질문을 올립니다. 볼랜드C++빌더를 사용하기 시작된지 2주일째 되는 완전초보입니다. 실무를 시작하기 전에 이것 저것 예제 프로그램을 짜보고 있는데, 쓰레드에 대한 부분에서 막혔습니다.
쓰레드에 대한 기본적인 지식은 있는 상태인데, C++에서 쓰레드를 사용해본적이 없어서 어떠한 개념으로 써야 하는지 감이 잡히지 않는 군요. (C++에 익숙하지가 않습니다.) 제가 짜보려는 프로그램은 아주 간단한 프로그램입니다. 스크린샷만 올려도 금방 감을 잡으실 수 있을 것 같군요.
보시다시피 Go!! 를 누르면 프로그레스 바가 앞으로 진행하다가, STOP!!을 누르면 바가 섭니다. 그리고 다시 Go!!를 누르면 바가 진행되는 프로그램입니다. (타이머도 써야겠지만 일단 타이머는 무시하지요.)
당연히 Form1을 만들고 그 안에 프로그레스바 오브젝트를 하나 넣습니다.
class TForm1 : public TForm
{
__published: // IDE-managed Components
TButton *btn_go;
TButton *btn_stop;
TBitBtn *btn_close;
TProgressBar *bar_run;
private: // User declarations
public: // User declarations
__fastcall TForm1(TComponent* Owner);
};
그리고 file메뉴에서 thread object를 하나 생성합니다. 당연히 이 DrawProgressBar 클래스의 오브젝트 하나를 TForm에서 생성해야 할 것입니다.
class DrawProgressBar : public TThread
{
private:
protected:
void __fastcall Execute();
public:
__fastcall DrawProgressBar(bool CreateSuspended);
};
까지 만들어 놓고 나니, 생기는 문제는 이 두 클래스에 서로 연관이 없다는 점이 생각이 났습니다. 즉, Go!! 버튼을 눌렀을때 발생하는 이벤트 핸들러를 이렇게 생각해 보겠습니다.
void __fastcall TForm1::btn_goClick(TObject *Sender)
{
MyProgressBar->go(); // MyProgressBar는 DrawProgressBar의 오브젝트.
}
그렇다면 이제 go() method는,
__fastcall DrawProgressBar::go(void)
{
bar_run->StepBy(1); // ????????
}
위에서 bar_run 오브젝트는 Form1에서 생성된 오브젝트라고 말씀드렸습니다. 따라서 아직 컴파일은 해보지 않았지만 당연히 이 코드는 이대로 돌아가지 않겠지요. 그렇다면 이 프로그레스바 오브젝트를 DrawProgressBar 클래스 안에서 선언해야 하는 걸까요? 만약 그렇다면 어떻게 그 오브젝트를 Form1 위에서 나타낼 수 있을까요?
결국 질문을 요약하면 이렇습니다. Form1이 갖고 있는 오브젝트를 어떻게 다른 클래스가 접근하느냐- 하는 것입니다. 혹은 접근하는 방법론에 대한 것이겠지요. (기술적인 것이 아니라 개념적인) 제 생각에는 C++ 코딩을 하다 보면 이런 문제 많이 만나게 될 것 같은데, 아직 제가 C++에 대한 개념이 정확하게 잡히지 않아 이런 부분을 해결하지 못하는 것 같습니다.
고수분들의 조언을 기다립니다. (정말 질문한번 길게 썼군요^^)
|