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的主要内容,如果未能解决你的问题,请参考以下文章

Console无界面程序如何使用SetTimer

Console无界面程序如何使用SetTimer

SetTimer

SetTimer如何修改间隔时钟uElapse

SetTimer如何修改间隔时钟uElapse

SetTimer如何修改间隔时钟uElapse