Console无界面程序如何使用SetTimer

12 篇文章 0 订阅
订阅专栏
3 篇文章 0 订阅
订阅专栏

在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 文件

结构体排序
MJ_Doris的博客
04-11 1406
结构体排序题目相关
VS中创建MFC界面人脸识别门禁系统(人脸识别+串口通讯+单片机STM32F407)
liqi123666的博客
06-29 3957
首先来说要做这个门禁系统,必须拥有三大功能板块儿,一是软件部分,也就是MFC界面要实现的功能进行人脸识别、人脸采集、并且录入人的相关信息;二是硬件部分,需要实现人脸识别成功之后开锁,人脸识别失败之后不能开锁的功能;三是通信方式,这里选择的是串口通讯,满足电脑PC通过数据线与STM32F407通讯。 ...
VS2022 VC++下控制台程序SetTimer定时器的应用
cjmsea的博客
12-10 2360
严重性 代码 说明 项目 文件 行 禁止显示状态 错误 C2664 “UINT_PTR SetTimer(HWND,UINT_PTR,UINT,TIMERPROC)”: 无法将参数 4 从“void (__cdecl *)(HWND,UINT,UINT,DWORD)”转换为“TIMERPROC” ConsoleApplication2 C:\Users\47452\source\repos\ConsoleApplication2\ConsoleApplication2\ConsoleApplication2
九九乘法表
Chinajielin的博客
06-09 298
九九乘法表之c/c++ 源代码 // 99乘法表.cpp : 此文件包含 “main” 函数。程序执行将在此处开始并结束。 // #include using namespace std; int main() { std::cout << “Hello World!\n”; for (int a = 1; a <= 9; a++) { for (int b = 1; b <=9; b++) { if (a >=b) {
如何进行结构体排序
weixin_34407348的博客
09-25 3449
结构体排序的几种情况 1.一个结构体中有三个元素,按照其中一个元素进行降序排列: 先定义一个结构体: struct node { int s; int t; int w; }a[1005]; 然后写排序代码: int cmp(node a, node b) { return a.s > b.s...
C++sort()对结构体类型排序
紫藤&code的博客
03-04 1万+
struct类型排序 #include &lt;iostream&gt; #include &lt;algorithm&gt; #include&lt;vector&gt; using namespace std; struct Date { int a; int b; }; bool com(const Date x,const Date y) { if(x.a==y.a...
windows程序-飞机的移动
06-24
在这个“Windows程序-飞机的移动”项目中,我们聚焦于如何在Visual Studio 2010环境下,使用Win32 API来实现位图的显示和动态移动。这个程序对于初学者来说,是一个很好的教学参考,能够帮助理解Windows编程的基本...
VC++ 自动关机定时关闭电脑源程序
12-25
在本文中,我们将深入探讨如何使用VC++编程语言来创建一个自动关机的定时器程序,以便在预设的时间关闭计算机。这个程序的核心是利用Windows API(应用程序接口)中的相关函数,例如`SetTimer`和`ShutdownSystem`,...
VC6.0 写的XP 定时关机程序
06-29
6. **事件调度**:为了让程序在指定时间点执行关机,可以使用Windows的消息机制,如`SetTimer`函数来设置一个定时器,当定时器触发时,执行关机操作。 7. **错误处理**:在调用API函数时,应该检查返回值,以处理...
VC++6.0绘制旋转文本程序源码解析
- 程序中可能涉及使用定时器(如SetTimer函数)来刷新显示,从而实现文本的动态旋转效果。 3. 程序文件说明: - Example.aps:该文件是应用程序的项目资源脚本文件,包含了程序使用的资源描述信息,如对话框、...
结构体的排序
RanNanzhou的博客
03-24 1298
结构体排序
对结构体元素进行排序
码码的小海绵
07-23 8896
知识点一:sort() sort()函数的头文件是algorithm,又被称为快速排序。其使用形式为: sort(start_address, end_address, [rule]) 我们在使用简单的对数组元素或是字符串排序的时候,第三个参数往往是省略的,代表你的排序规则默认是从小到大排序,当然也可以带参数,那么就可以通过用系统的排序规则sort(a,a+7,less<int>(...
结构体排序(sort)
热门推荐
weixin_54197094的博客
11-04 1万+
嘿嘿 个人比较喜欢用结构体来存两个有关联的变量,而不喜欢用二维数组,因为很容易出错,所以,想写一篇关于结构体排序的博客哈哈哈哈哈✪ ω ✪ 头文件 我最经常用的是sort排序,,,这里头文件用的是 #include<algorithm> 使用方法 sort()函数的最常用,就是数组的排序,但是它也可以用在结构体排序上面 1.我们的结构体命名为一个结构体数组 struct Student { char name[11]; int solve;
linux下使用SetTimer
最新发布
09-20
在Linux环境下,`SetTimer`通常是用于控制窗口系统的定时器,比如在GTK+或Qt这样的图形用户界面库中,而不是标准的POSIX系统调用。如果你是在谈论系统定时器,那么在Linux中,你可以使用`timerfd`、`clock_gettime`和`clock_nanosleep`等函数来创建和管理定时器。 `SetTimer`的概念更多地与Windows API相关,而在Linux下,我们可以使用`timerfd_create`创建一个文件描述符,然后通过`write`系统调用设置超时时间,当超时时会触发相应的回调。以下是使用`timerfd_create`的一个基本示例: ```c #include <stdio.h> #include <stdlib.h> #include <sys/timerfd.h> #include <unistd.h> #define TIMER_INTERVAL 1000 // 1秒 int main() { int timer_fd = timerfd_create(CLOCK_MONOTONIC, TFD_NONBLOCK); if (timer_fd == -1) { perror("Failed to create timer"); return 1; } struct itimerspec its; its.it_value.tv_sec = TIMER_INTERVAL / 1000; its.it_value.tv_nsec = TIMER_INTERVAL % 1000 * 1000000; its.it_interval.tv_sec = its.it_value.tv_sec; its.it_interval.tv_nsec = its.it_value.tv_nsec; if (timerfd_settime(timer_fd, 0, &its, NULL) == -1) { perror("Failed to set time for the timer"); close(timer_fd); return 1; } // 这里可以继续执行其他任务,定时器会在指定间隔后唤醒进程 while (true) { char buf[8]; read(timer_fd, buf, sizeof(buf)); printf("Timer expired\n"); } close(timer_fd); return 0; } ```
写文章

热门文章

  • std::map 如何插入键值对 45928
  • Qt学习之QListWidget删除Item 32803
  • Qt(QLabel)实现滚动字幕 30714
  • UE4 显示帧率的几种姿势 27224
  • UE4实现纹理缩放(将纹理坐标进行缩放) 23192

分类专栏

  • DirectX XAudio2 付费 39篇
  • Windows开发 3篇
  • Qt学习和实战 37篇
  • Unreal Engine 4 15篇
  • OSG 5篇
  • OpenGL/GLSL 3篇
  • JNI 1篇
  • 刷题 1篇
  • Qt 43篇
  • UE4 15篇
  • C++ 12篇
  • OpenGL/GLSL 4篇
  • OSG 5篇
  • VS 4篇
  • 音频相关 6篇
  • 搜索引擎 1篇
  • 网站技术 1篇
  • boost 2篇
  • 字体处理 17篇
  • Uniscribe 2篇
  • NVPath 1篇

最新评论

  • UE4 显示帧率的几种姿势

    阿木呀: 那需要在蓝图内进行编辑,在你需要的特定条件下,用整数1整除GetWorldDeltaSeconds(游戏中刷新每帧的时间),得出的结果打印出来即可

  • Qt学习之QListWidget添加Item

    2301_80059307: 输入没有显示addItem咋回事,也有头文件

  • QPushButton下拉式菜单(是否取消下拉三角,是否check)

    六号跑道01: 稍微补充一下: QMenu* m_menu = new QMenu(this); QAction* m_addAction = new QAction(m_menu); QAction* m_delAction = new QAction(m_menu); m_addAction->setText(QObject::tr("添加")); m_delAction->setText(QObject::tr("删除")); m_addAction->setCheckable(true);//是否可以check m_delAction->setCheckable(true);//是否可以check m_menu->addAction(m_addAction); m_menu->addAction(m_delAction); connect(m_addAction, &QAction::triggered, this, &MainWindow::addFunc); connect(m_delAction, &QAction::triggered, this, &MainWindow::delFunc); QPushButton* m_pushButton = new QPushButton(this); m_pushButton->setText(QObject::tr("测试按钮菜单")); m_pushButton->setMenu(m_menu);//设置菜单 //m_pushButton->setStyleSheet("QPushButton::menu-indicator{image:none;}");//不显示下拉图片[code=cpp] [/code]

  • Qt学习之给QPushButton添加菜单ActionsContextMenu方法

    六号跑道01: 没实现,不知道我错在哪里表情包

  • UE4打包后运行exe黑屏

    一然明月: 一个编辑器开始地图 一个游戏默认地图 你看看你的游戏默认地图也设置了吗

大家在看

  • 单片机通过AT指令控制ESP8266+TCP 实现收发数据
  • STM32--JQ8900语音模块
  • 论文 Python 实现WOA-CNN-BiGRU-Attention数据分类预测 64
  • 手环押金原路退回系统——足浴店——东方仙盟

最新文章

  • Windows API遍历桌面上所有文件
  • QT常见面试题,基础知识偏多
  • SetTimer如何修改间隔时钟uElapse
2023年1篇
2021年4篇
2020年4篇
2019年1篇
2018年1篇
2017年26篇
2016年94篇
2015年14篇
2014年6篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GreenArrowMan

请打钱~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或 充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

玻璃钢生产厂家山西玻璃钢卡通雕塑羊陕西特色玻璃钢雕塑价位废旧玻璃钢雕塑玻璃钢孔子雕塑清远玻璃钢浮雕雕塑批发保定口碑好玻璃钢雕塑品牌企业定西玻璃钢景观雕塑价格无锡商场美陈策划玻璃钢圆雕雕塑定西玻璃钢动物雕塑价格内蒙古景观玻璃钢雕塑价格连云港美创玻璃钢雕塑甘肃玻璃钢海洋馆雕塑曲靖玻璃钢雕塑价格商场美陈的案例东莞透明玻璃钢雕塑摆件漳州玻璃钢仿铜雕塑定制上饶玻璃钢雕塑价位福建玻璃钢卡通雕塑立体制作咸阳动物玻璃钢雕塑厂家商场dp景点美陈装饰玻璃钢海洋动物雕塑产品厂家山东商场主题创意商业美陈传播水晶玻璃钢人物雕塑厂家电话乐陵玻璃钢雕塑江门玻璃钢雕塑定制苏州商场美陈有哪些亳州玻璃钢雕塑公司价格济南通用玻璃钢雕塑摆件常用玻璃钢雕塑摆件订购香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化