|
이유는 TimerTimer함수가 끝날때까지 Window가 RePaint되지 않았기 때문입니다.
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
Panel1->Caption = ++i;
Sleep(1000);
Button1->Caption = ++a;
}
Panel1의 Caption을 수정하고
Sleep(1000)으로 1초있다가 Button1->Caption을 수정하지만
그후에야 Panel1가 Button1의 Paint가 일어나거든요
화면에는 동시에 바뀔수 밖에 없습니다.
만약 그렇게 하고자 한다면
[방법1]
그냥 로직으로
Timer를 1초 걸어놓고 한번은 Panel을 ++하고 한번은 Button1을 ++하는방법이 있구요
[방법2]
Panel1->Caption을 ++한뒤에 강제로 Repaint해주는 방법이 있습니다.
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
Panel1->Caption = ++i;
Panel1->Repaint();
Sleep(1000);
Button1->Caption = ++a;
}
//---------------------------------------------------------------------------
그러나 만약 timer를 1초로 해둑고 위와같이 코딩하면
또 동시에 바뀌는것럼 보입니다.
단 이때는 숫자가 다르게 나타나죠
왜냐하면 타이머가 1초 걸려있는데 Sleep(1000)에서 1초 쉬었기 때문에
Button1->Caption이 바뀐뒤바로 그다음 Timer이벤트가 일어나서 Panel1->Caption이 바뀌죠
타이머를 2초로 해두고 위와같이 코딩하면 차례차례 1씩 증가되는것을 볼수 있습니다.
만약 타이머를 1초로 두고 그렇게 하고싶다면
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
Panel1->Caption = ++i;
Panel1->Repaint();
Sleep(500);
Button1->Caption = ++a;
Button1->Repaint();
Sleep(500);
}
//---------------------------------------------------------------------------
위와 같이 하시면 됩니다.
또한
Repaint()함수 대신에
Application->ProcessMessages(); 를 이용할수도 있습니다.
이경우 프로그램의 Window에서 일어나는 모든 메세지를 처리해주기 때문에
TimerTimer 함수가 끝나기 전에 또 이벤트가 발생할수 있습니다.
충분히 Timer의 시간이 길면 괜찮지만요....
그럼
보라색파리 님이 쓰신 글 :
: 간단하게 타이머 하나만 사용해서 테스트를 해봤는데요.. 아래와 같이 i, a 각각 0으로 시작해서 i가 바뀌고 나서
:
: 1초후에 a가 바뀌게 했는데..디버깅 할때는 예상대로 들어가는데...실행모드로 들어가면 패널과 버튼 캡션이
:
: 동시에 똑같이 증가되서 나오거든요...왜그럴까여..? 참고로 타이머 인터벌은 1로 하였습니다...
:
: 간단하니 님들도 테스트점 해봐주세요....
:
:
:
: __fastcall TForm1::TForm1(TComponent* Owner)
: : TForm(Owner)
: {
:
: i = 0;
: a = 0;
:
: Panel1->Caption = i;
:
: Button1->Caption = a;
: }
: //---------------------------------------------------------------------------
:
: void __fastcall TForm1::Timer1Timer(TObject *Sender)
: {
:
: Panel1->Caption = ++i;
:
: Sleep(1000);
:
: Button1->Caption = ++a;
: }
|