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
[45846] Re:타이머 관련해서 질문드립니다.....
장성호 [nasilso] 885 읽음    2006-07-26 13:11
이유는 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;
: }

+ -

관련 글 리스트
45845 타이머 관련해서 질문드립니다..... 보라색파리 797 2006/07/26
45846     Re:타이머 관련해서 질문드립니다..... 장성호 885 2006/07/26
45847         아~~~그렇군요...너무 감사합니다..... 보라색파리 751 2006/07/26
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.