타이머 이벤트 안에서 메시지 박스를 출력할 때 팁입니다.
빈 폼에 타이머 하나 올립니다.
그리고 더블클릭해서 코딩을 합니다.
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;
}
보통 이렇게 처리하는게 가장 무난합니다.
이렇게 하면 타이머 루틴이 실행중에 그 어떤 일이 있더라도(물론 예외는 알아서 잡아야 겠죠)
타이머 루틴이 중복해서 실행되는 것을 막을 수 있습니다.
타어머 핸들러에서는 위처럼 가급적 중복 방지 코드를 넣는게 좋습니다.
이런 걸 팁이라고 올렸냐고 하실 분을 위해 이만 잠수.
|