|
강영준 님이 쓰신 글 :
: 압축파일에 보면.. 쓰래드에서..
:
: 메인폼에 있는 페인트박스에다가 그림을 옮겨 주면서.. 계속 그려 주는건데요.
:
: 밑에 만들어진 페이지컨트롤의 텝을 막.. 눌러서.. 페이지를 바꾸다 보면..
:
: 흘러 가는 그림이 멈춰 버리드라구요.. 그렇다고 쓰래드가 죽은거 같진 않은데..
:
: 문제는.. 지금 프로그램과 같이 여러 라인을 만들어서.. 쓰래드에서 그림을 흘러 가는듯..
:
: 하게 돌리다 보면..
:
: 에러가 나드라구요.. 여러번 게시판에 질문을 올렸지만..
:
: "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;
}
|