メッセージループを自分で書かずに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); }