ぷるぷるの雑記

低レイヤーがんばるぞいなブログ. 記事のご利用は自己責任で.

WindowsのコンソールアプリケーションでGetMessageを使わずにタイマーを使う

メッセージループを自分で書かずにWindowsのコンソールアプリケーションでタイマーを使う方法が無いか調べたところ、 CreateTimerQueueTimer関数 というものを見つけました.

以下プログラムは、約100msごとにHelloという文字列がコンソールに表示されます.

#include <iostream>
#include <Windows.h>

using namespace std;

/* メインスレッド */
void Loop();

/* コールバック */
void CALLBACK OnTimer(PVOID lpParameter, BOOLEAN TimerOrWaitFired);

HANDLE hEvent;
HANDLE hTimer;

int main()
{
    hEvent = CreateEventW(
        NULL,               /* セキュリティ属性   */
        FALSE,              /* 手動リセットオフ   */ 
        TRUE,               /* 初期状態          */
        (LPCWSTR)"PROC1"    /* イベント名        */
    );

    CreateTimerQueueTimer(
        &hTimer,            /* タイマーハンドル             */
        NULL,               /* タイマーキューへのハンドル   */
        OnTimer,            /* コールバック関数             */
        NULL,               /* コールバックに渡すパラメタ   */
        0,                  /* 初めて発火するまでの時間     */
        100,                /* 発火のインターバル           */
        WT_EXECUTEDEFAULT   /* タイマーの種々の設定         */
    );

    Loop();
}

void Loop()
{
    while (1) {
        
        /* 手動リセットオフなので自動的に非シグナル状態になる   */
        WaitForSingleObject(hEvent, INFINITE);
        cout << "Hello" << endl;

    }

}

void CALLBACK OnTimer(PVOID lpParameter, BOOLEAN TimerOrWaitFired)
{
    SetEvent(hEvent);
}

参考

stackoverflow.com

learn.microsoft.com