C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 팁&트릭
C++Builder Programming Tip&Tricks
[996] 타이머 안에서 메시지 박스 중복해서 띄우지 않으면서 타이머 계속 동작시키기.
김태선 [cppbuilder] 13699 읽음    2010-07-16 16:25
타이머 이벤트 안에서 메시지 박스를 출력할 때 팁입니다.

빈 폼에 타이머 하나 올립니다.
그리고 더블클릭해서 코딩을 합니다.

void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
    MessageBox(Handle, "하하 스머프 호호 스머팻 입니다.", "Message", MB_ICONINFORMATION);
}

내용은 위와 같습니다. 그냥 메시지 박스 하나 띄우는 것입니다.

그런데 실행하면 1초 마다 계속 메시지 박스가 뜨죠.
이걸 어떻게 하면 다른 루틴 손대지 않고 여기서 깔끔하게 중복해서 뜨지 않게 해결할 수 있을 까요?

void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
    Timer1->Enabled = false;
    MessageBox(Handle, "하하 스머프 호호 스머팻 입니다.", "Message", MB_ICONINFORMATION);
    Timer1->Enabled = true;
}

간단이 이렇게 하면 됩니다.
하지만 타이머는 계속 동작을 해야 한다면?
그렇다면 아래와 같은 예제가 가장 깔끔한 코드가 될 것입니다.

void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
    static int count = 0;
    Caption = count++;  // 요건 타이머가 계속 동작하고 있다는 표시..

    // 타이머 멈추지 않고 메시지 박스 내보내기.
    {
        static bool bDisplay = false;
        if (!bDisplay)
        {
            bDisplay = true;
            MessageBox(Handle, "하하 스머프 호호 스머팻 입니다.", "Message", MB_ICONINFORMATION);
            bDisplay = false;
        }
    }
}

이 코드의 가장 큰 장점은 복사신공을 쉽게 쓸수 있다는 점입니다.


타이머가 중복해서 걸리지 않게 하는 가장 보편적인 방법은

void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
    static bool bTimer = false;
    if (!bTimer)
    {
        bTimer = true;

        // Do something...
        ;
    }
    bTimer = false;
}

보통 이렇게 처리하는게 가장 무난합니다.
이렇게 하면 타이머 루틴이 실행중에 그 어떤 일이 있더라도(물론 예외는 알아서 잡아야 겠죠)
타이머 루틴이 중복해서 실행되는 것을 막을 수 있습니다.
타어머 핸들러에서는 위처럼 가급적 중복 방지 코드를 넣는게 좋습니다.


이런 걸 팁이라고 올렸냐고 하실 분을 위해 이만 잠수.
크레브 [kkol]   2010-07-16 16:33 X
빌더 초보에게는 상당히 유용한 팁이 될듯해요~ ^^
장성호 [nasilso]   2010-07-16 20:39 X
아랫쪽에 [퀴즈]중에
Timer사용에 대한것과 관련된것이네요.
http://cbuilder.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_tip&no=981

+ -

관련 글 리스트
996 타이머 안에서 메시지 박스 중복해서 띄우지 않으면서 타이머 계속 동작시키기. 김태선 13699 2010/07/16
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.