티스토리 뷰

개발/코더 탈출

Timer vs Thread+Sleep

-=HaeJuK=- 2024. 12. 24. 18:48
728x90
SetTimer vs Thread Sleep vs CreateTimerQueueTimer 비교

SetTimer vs Thread Sleep vs CreateTimerQueueTimer 비교

윈도우 애플리케이션에서 일정 시간 간격으로 작업을 수행하는 방법으로 SetTimer, Thread + Sleep, CreateTimerQueueTimer가 자주 사용됩니다. 각각의 방식은 동작 방식과 장단점이 다르며, 상황에 따라 적합한 방식이 달라집니다.

1. SetTimer

동작 방식: 일정 시간 간격으로 WM_TIMER 메시지를 메시지 큐에 추가하여 타이머 이벤트를 발생시킵니다. 메인 스레드에서 타이머 콜백이 처리됩니다.

SetTimer(hWnd, 1, 1000, NULL);  // 1초마다 WM_TIMER 발생

switch (message) {
    case WM_TIMER:
        if (wParam == 1) {
            SendData();  // 데이터 전송
        }
        break;
}

장점

  • 비동기 처리 - GUI 응답성을 유지합니다.
  • 간단한 구현 - 윈도우 메시지 루프 기반으로 동작합니다.

단점

  • 정확성 낮음 - GUI가 멈추거나 메시지 큐가 밀리면 지연됩니다.
  • 메시지 루프 필요 - 콘솔 애플리케이션에서는 사용하기 어렵습니다.

2. Thread + Sleep

동작 방식: 별도의 스레드를 생성하고 일정 시간 동안 스레드를 블로킹합니다.

std::thread([]() {
    while (true) {
        SendData();
        Sleep(1000);  // 1초 대기
    }
}).detach();

장점

  • 정확성 높음 - 지정한 시간 동안 정확하게 대기합니다.
  • 메시지 루프 필요 없음 - 콘솔 및 서버 애플리케이션에 적합합니다.

단점

  • 스레드 블로킹 - 스레드가 Sleep 동안 다른 작업을 수행할 수 없습니다.
  • GUI 비응답 - 메인 스레드에서 사용하면 응답성이 저하됩니다.

3. CreateTimerQueueTimer

동작 방식: 타이머 큐를 생성하고, 스레드 풀에서 타이머 콜백을 실행합니다. 타이머 만료 시 별도의 스레드에서 콜백이 호출됩니다.

HANDLE hTimerQueue = CreateTimerQueue();
HANDLE hTimer;

CreateTimerQueueTimer(&hTimer, hTimerQueue, 
    (WAITORTIMERCALLBACK)[](PVOID lpParam, BOOLEAN TimerOrWaitFired) {
        SendData();
    },
    NULL, 0, 1000, WT_EXECUTEDEFAULT);

DeleteTimerQueue(hTimerQueue);

장점

  • 비동기 처리 - 스레드 풀에서 타이머 콜백이 실행됩니다.
  • 정확성 높음 - GUI와 독립적으로 동작합니다.

단점

  • 복잡성 - 리소스 관리와 콜백 구현이 필요합니다.

4. 비교표

항목 SetTimer Thread + Sleep CreateTimerQueueTimer
비동기성 O X O
정확성 낮음 높음 높음
GUI 응답성 유지 저하 유지
멀티스레드 처리 X O O

결론: GUI 작업에는 SetTimer가 적합하며, 서버 및 백그라운드 작업에는 Thread + Sleep 또는 CreateTimerQueueTimer를 사용합니다.

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함
250x250