15 мая 2023 года "Исходники.РУ" отмечают своё 23-летие!
Поздравляем всех причастных и неравнодушных с этим событием!
И огромное спасибо всем, кто был и остаётся с нами все эти годы!

Главная Форум Журнал Wiki DRKB Discuz!ML Помощь проекту


Консольный таймер

Следующий пример консольной программы устанавливает таймер при помощи SetTimer а затем в цикле принимает от него сообщения. В цикле происходит получение и обработка сообщений WM_TIMER, вызывая при этом процедуру таймера.

#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;
}

Эта программа была написана после прочтения статьи MS KB Q102482 - INFO: SetTimer() не должна использоваться в консольных приложениях, так как консольные приложения не поддерживают разделения потоков. Статья Under The Hood (March 1997) содержит набор примеров консольных программ, похожих на вышеприведённый пример, которые используют SetTimer() без разделения потоков.