четверг, 10 октября 2013 г.

Таймер в консольном проекте


Сразу к делу. Тут же оговорюсь, что таймер специфичен для виндов. В примере - каждую секунду пишет на консоль и аппендит в файл текущее системное время. Нарочно даю реализацию коллбековой функцией (запись в файл) и обработчиком в цикле (на консоль). По стилю - пародия на С, если есть грубые ужасные ошибки - не думайте плохо, времени - час ночи. Код под катом.

#include <windows.h>
#include <ctime>
#include <cstdio>

#define TICK_PERIOD 1000

FILE *filePtr;

VOID CALLBACK TimerProc(HWND, UINT, UINT, DWORD) {
time_t curTime;
tm *timeinfo;

time(&curTime);
timeinfo = localtime(&curTime);
fprintf(::filePtr,"%2.2i:%2.2i:%2.2i\r", timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec);
}

int main(int argc, char *argv[]) {
MSG Msg;
UINT timerId;
time_t curTime;
tm *timeinfo;

if ((filePtr = fopen("times.csv", "a")) == NULL) {
return EXIT_FAILURE;
}
/*
Вместо указателя на TimerProc можно дать NULL и пользоваться очередью
*/
if ((timerId = SetTimer(NULL, 0, TICK_PERIOD, &TimerProc)) == NULL) {
fclose(filePtr);
return EXIT_FAILURE;
}

while (GetMessage(&Msg, NULL, 0, 0)) {
/* альтернатива TimerProc,
если необходимо, проверять
timerId
*/
if (Msg.message == WM_TIMER) {
time(&curTime);
timeinfo = localtime(&curTime);
printf("%2.2i:%2.2i:%2.2i\r", timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec);
}
DispatchMessage(&Msg);
}
fclose(filePtr);
return EXIT_SUCCESS;
}

Комментариев нет:

Отправить комментарий