Console无界面程序如何使用SetTimer
Posted GreenArrowMan
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Console无界面程序如何使用SetTimer相关的知识,希望对你有一定的参考价值。
在Windows开发中免不了一些场景中是无界面的程序。但是我们又需要使用Windows API中的定时器SetTimer来进行定时处理一些任务。
我们都知道Windows是消息驱动的,那定时器SetTimer的超时也是通过消息来驱动的,Console进程主线程没有消息的循环分发,Windows是不会调用我们的超时回调函数的。
这种情况下,我们需要如何处理呢?
我们可以主动在当前线程中添加一个消息循环,来使当前线程中的消息分发下去,从而使定时器可以正常的运行。
在Demo中我创建了一个定时器,设置超时时间为3s,在超时回调函数中,获取当前时间并输出,可以比较清晰的看到执行的结果。
使用VS创建一个Console的工程,然后将代码复制进去就可以执行:
// ConsoleApplication1.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <iostream>
#include <windows.h>
VOID CALLBACK TimerProc(HWND hwnd, UINT message, UINT iTimerID, DWORD dwTimer)
//获取系统时间
SYSTEMTIME time;
GetLocalTime(&time);
char dateTimeStr[200] = 0 ;
sprintf_s(dateTimeStr, "%d-%02d-%02d %02d:%02d:%02d", time.wYear, time.wMonth, time.wDay, time.wHour, time.wMinute, time.wSecond);
std::cout << dateTimeStr << std::endl;
int main()
UINT_PTR uTimerID = SetTimer(NULL, 0, 3000, TimerProc);
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
DispatchMessage(&msg);
KillTimer(NULL, uTimerID);
return 0;
// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单
// 入门使用技巧:
// 1. 使用解决方案资源管理器窗口添加/管理文件
// 2. 使用团队资源管理器窗口连接到源代码管理
// 3. 使用输出窗口查看生成输出和其他消息
// 4. 使用错误列表窗口查看错误
// 5. 转到“项目”>“添加新项”以创建新的代码文件,或转到“项目”>“添加现有项”以将现有代码文件添加到项目
// 6. 将来,若要再次打开此项目,请转到“文件”>“打开”>“项目”并选择 .sln 文件
以上是关于Console无界面程序如何使用SetTimer的主要内容,如果未能解决你的问题,请参考以下文章