The following console program works. It sets a timer using SetTimer
then loops in a message loop. The message loop receives and processes WM_TIMER
messages and the timer callback also is called for each time interval.
#define STRICT 1
#include <windows.h>
#include <iostream.h>
VOID CALLBACK TimerProc(HWND hWnd, UINT nMsg, UINT nIDEvent, DWORD dwTime) {
cout << "Time: " << dwTime << '\n';
cout.flush();
}
int main(int argc, char *argv[], char *envp[]) {
int Counter=0;
MSG Msg;
UINT TimerId = SetTimer(NULL, 0, 500, &TimerProc);
cout << "TimerId: " << TimerId << '\n';
if (!TimerId)
return 16;
while (GetMessage(&Msg, NULL, 0, 0)) {
++Counter;
if (Msg.message == WM_TIMER)
cout << "Counter: " << Counter << "; timer message\n";
else
cout << "Counter: " << Counter << "; message: " << Msg.message << '\n';
DispatchMessage(&Msg);
}
KillTimer(NULL, TimerId);
return 0;
}
I wrote this program after reading MS KB article Q102482 - INFO:
SetTimer() Should Not Be Used in Console Applications which says that
SetTimer() in a console application requires a separate thread. The Under
The Hood article in the March 1997 issue of MSJ has a couple of sample
console programs very similar to mine above. Like mine, they use SetTimer()
without a separate thread.