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
[27875] Re:이거 한번 확인해 보세요. Thread
임문환.실업자 [origin] 1428 읽음    2003-11-14 19:26
강영준 님이 쓰신 글 :
: 압축파일에 보면.. 쓰래드에서..
:
: 메인폼에 있는 페인트박스에다가 그림을 옮겨 주면서.. 계속 그려 주는건데요.
:
: 밑에 만들어진 페이지컨트롤의 텝을 막.. 눌러서.. 페이지를 바꾸다 보면..
:
: 흘러 가는 그림이 멈춰 버리드라구요.. 그렇다고 쓰래드가 죽은거 같진 않은데..
:
: 문제는.. 지금 프로그램과 같이 여러 라인을 만들어서.. 쓰래드에서 그림을 흘러 가는듯..
:
: 하게 돌리다 보면..
:
: 에러가 나드라구요.. 여러번 게시판에 질문을 올렸지만..
:
: "Canvas does not allow drawing" 이란 예외가 발생되는데..
:
: 보시구 보다 더 좋은 기술 있으면 좀 알려 주세용~~~~

Synchronize 메서드를 사용해야 합니다.
Synchronize 메서드에 대한 자세한 내용은 빌더의 도움말을 참고하시기 바랍니다.

아래에서, CALL_METHOD 매크로는 테스트의 편의를 위해 만들어본 것입니다.

class FlowBar : public TThread
{           
private:
  int Bar;
  int Bar1;
  Graphics::TBitmap* MB1;
  String Edit1Text;
  void __fastcall DrawFlowBar(void);
  void __fastcall SetEdit1Text(void);
protected:
  void __fastcall Execute();
public:
  __fastcall FlowBar(bool CreateSuspended);
};

__fastcall FlowBar::FlowBar(bool CreateSuspended)
    : TThread(CreateSuspended)
{
  Priority = tpTimeCritical;
  FreeOnTerminate = true;
}

void __fastcall FlowBar::DrawFlowBar(void)
{
    Form1->PaintBox1->Canvas->Draw(Bar,0,MB1);
}

void __fastcall FlowBar::SetEdit1Text(void)
{
Form1->Edit1->Text = Edit1Text;
}

#define SYNCHRONIZE_VCL
#ifdef SYNCHRONIZE_VCL
#define CALL_METHOD(func) Synchronize(func)
#else
#define CALL_METHOD(func) func()
#endif

//---------------------------------------------------------------------------
void __fastcall FlowBar::Execute()
{
  MB1 = new Graphics::TBitmap;
  MB1->LoadFromResourceName((int)HInstance,"FLOWBAR_H");
  Bar=-30;
  Bar1 = -30;

while(!Form1->ThClose && !Terminated){
   // Form1->Edit1->Text = "Start";
    //Form1->PaintBox1->Canvas->Draw(Bar,0,MB1);
    CALL_METHOD(DrawFlowBar);
    Bar += 2;
    if(Bar >= 493) Bar = -30;
   // Form1->Edit1->Text = "End";  Synchronize

    //Form1->PaintBox1->Canvas->Draw(Bar1,0,MB1);
    CALL_METHOD(DrawFlowBar);
    Bar1 += 3;
    if(Bar1 >= 493) Bar1 = -30;
    Sleep(10);
}
// Form1->Edit1->Text = "Thread Killed";
  Edit1Text="Thread Killed";
  CALL_METHOD(SetEdit1Text);
  delete MB1;

}

+ -

관련 글 리스트
27874 이거 한번 확인해 보세요. 강영준 885 2003/11/14
27875     Re:이거 한번 확인해 보세요. Thread 임문환.실업자 1428 2003/11/14
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.