线程分离的定时器一点经验

win32多媒体定时器 win32多媒体定时器 几个拉跨的定时器精度 select选择模型:15ms Sleep(1) :15ms timeGetTime: 5ms QueryPerformanceCounter:<1微秒 (win2000支持) 精度达到1ms的定时器:多媒体定时器(win95支持) 原理分析:多媒体定时器被创建后,应用程序有一个定时器消息队列,系统以1ms(最高精度)的周期向程序发送定时器消息。当应用程序收到消息时,调用回调函数。此回调函数优先级非常高(最高),甚至可以将Sleep的精度压缩到1ms(普通 阅读详情
说道定时器,很多人都会想到Windows定时器SetTimer吧!其实,项目里面原本确实是使用这种方法实现动画效果的,但是后来问题出现了!由于WM_TIMER消息优先级比较低,常常被丢失,导致一个WM_MOUSEMOVE消息都会影响整个动画的效果。

  这时我就考虑,是否能给定时器创建一个单独的线程,接着就发现了“多媒体定时器”这个东西。它是一个高精确度定时器,一般的Windows定时器只能精确到55ms,而多媒体定时器能精确到10ms内。同时,在启动一个多媒体定时器的同时,会自动创建一个线程,专门负责定时器控制。不仅如此,多媒体计时器具有较高的优先级(记得是15),因此能够满足实时控制的需求。但是这也为它带来了不利的因素,同时对于定时器响应函数的内容也有一些限制,具体情况有时间再详细说明下!

为了学会使用它,我研究了很多相关资料,其中经典的算《C++builder 深度历险》这本书了。嘿嘿~ 闲暇的时间看了下C++builder,又收获了一些其它知识。

  首先,简要介绍下几个重要的函数,具体说明见MSDN!

 1)MMRESULT timeGetDevCaps( LPTIMECAPS ptc, UINT cbtc );

   功能:获得计时器所支持的解析度范围。

 2)MMRESULT timeBeginPeriod( UINT uPeriod );

   功能:调整计时器的解析度,用在启动计时器之前。

 3)MMRESULT timeEndPeriod( UINT uPeriod );

  功能:调整计时器的解析度,用在结束计时器之后。这两个函数通常是成对出现。

 4)MMRESULT timeSetEvent( UINT uDelay, UINT uResolution, LPTIMECALLBACK lpTimeProc, DWORD_PTR dwUser, UINT fuEvent );

  功能:设置并启动一个计时器

 5)MMRESULT timeKillEvent( UINT uTimerID );

  功能:取消一个定时器

  好了!废话不多少,直接跳到使用方法阶段:

  1)设置并启动定时器

1   if (timeBeginPeriod(5) == TIMERR_NOERROR )
2   {
3       m_uTimerID = timeSetEvent(30,5,TimeProc,(DWORD)GetSafeHwnd(),TIME_PERIODIC);
4   }
  2)取消定时器

1 timeKillEvent(m_uTimerID);
2 timeEndPeriod(5);
  3)定时器处理函数

1 void _stdcall TimeProc(UINT uTimerID,UINT uMessage,DWORD dwUser,DWORD dw1,DWORD dw2)
2 {
3     ::SendMessage((HWND)dwUser,UM_TIMER_PROC,0,0);
4 }
Tip:  定时器处理函数一般定义为全局函数,而函数内部使用的方法也只能是全局变量或函数!

   最后,不要忘记加上以下头文件和动态链接库:

1 #pragma comment(lib,"Winmm.lib")
2 
3 #include <Mmsystem.h>
MFC定时器更新列表框:从WM_TIMER消息机制到UI线程安全实践 从Windows消息机制和UI线程操作边界出发,解析定时器与控件刷新的底层原理。MFC中SetTimer触发WM_TIMER消息,在UI主线程中处理,确保列表控件更新安全;而消息优先级和线程模型决定了实时刷新的性能表现。这种“定时驱动+队列节流”的模式在串口调试、数据监控、日志查看等场景中广泛应用,是上位机界面开发的核心技能之一。文章通过完整示例展示定时器创建、消息映射、列表更新、资源销毁的全流程,并梳理行数限制、自动滚动、耗时任务移出等工程实践。 阅读详情

相关推荐

上位机定时器设计:多Timer任务拆分与最佳实践

定时器是编程中常用的时间触发机制,用于在指定间隔执行任务。在上位机开发中,定时器设计直接影响系统稳定性与响应速度。如果所有任务共用一个定时器,容易出现界面卡顿、数据丢帧、任务互相干扰等问题。通过理解不同定时器(如System.Windows.Forms.Timer、System.Timers.Timer)的适用场景,按任务频率拆分定时器、为回调设置时间预算、使用标志位防止重入,可构建高效的任务调度方案。C# WinForms/WPF环境下,结合状态机与队列模型,能进一步优化多任务处理。本文从基础概念出发,分

weixin_30363981的博客 555

多个定时器的使用

一、定时器的基本使用方法 在编程时,会经常使用到定时器。使用定时器的方法比较简单,通常告诉WINDOWS一个时间间隔,然后WINDOWS以此时间间隔周期性触发程序。通常有两种方法来实现:发送WM_TIMER消息和调用应用程序定义的回调函数。 1.1 用WM_TIMER来设置定时器 先请看SetTimer这个API函数的原型 UINT_PTR SetTimer(

Windows CE学习与开发 2737

Qt定时器实战:5个QTimer高频使用场景代码示例(附避坑指南)

本文深入解析Qt定时器QTimer的5个高频使用场景,包括界面刷新、硬件通信、输入防抖、多定时器协同和跨线程任务,提供实用代码示例和避坑指南。针对Qt开发者常见的定时器误用问题,给出CPU占用优化、线程安全等专业建议,帮助提升实时应用的开发效率。

weixin_26985923的博客 170

Windows下的多媒体定时器:timeSetEvent

Windows下的多媒体定时器 头文件:#include timeSetEvent(15000, 1, (LPTIMECALLBACK)onTimeFunc, (DWORD)this, TIME_PERIODIC); 第一个参数是毫秒数,第二个参数是延迟时间,越小越精确,最小为1,第三个是回调函数,LPTIMECALLBACK的定义为: typedef TIMECALLBACK FA

李梦箫 6085

C++定时器实现:从标准库到跨平台框架的演进与实战

本文系统梳理了C++定时器的实现方式,从简单的标准库线程休眠法,到基于条件变量的单线程管理方案,再到利用Linux的timerfd和Windows的CreateTimerQueueTimer等系统级API实现高精度定时,最后介绍了Boost.Asio和Qt等跨平台框架的成熟解决方案。文章通过对比分析,为不同场景下的定时器选型提供了实战指南,帮助开发者构建高精度、低开销、易管理的定时器系统。

weixin_29012677的博客 206

C++时间轮定时器:从条件变量到毫秒级精度的工程实践

本文深入探讨了C++时间轮定时器的实现与优化,从条件变量到毫秒级精度的工程实践。通过环形哈希表设计、动态等待算法优化和线程池隔离等关键技术,显著提升定时器性能。在金融交易、物联网等场景中,时间轮定时器展现出高效的调度能力,确保系统响应速度和稳定性。

weixin_30485379的博客 430

线程的定时器问题

多线程的定时器是一种在多线程环境下实现定时任务的技术。它能够让多个线程在指定的时间点执行特定的任务,而不需要每个线程都自己实现一个定时器。使用多线程的定时器可以避免线程阻塞和任务调度的复杂性,提高代码的可读性和可维护性。在多线程的定时器中,一般通过一个定时器线程来维护所有的定时任务,该线程负责按照指定的时间间隔检查所有的任务,并在任务的执行时间点将任务放入一个线程池中,让线程池中的线程来执行任务。多线程的定时器可以通过Java内置的Timer类来实现,也可以使用第三方框架,如Quartz等。

qq_45726327的博客 1554

PostThreadMessage和_beginthreadex使用示例

PostThreadMessage、_beginthreadex和PeekMessage使用示例,以及WaitForSingleObject事件机制示例。

linux线程多个定时器,Linux使用一个定时器实现设置任意数量定时器功能

为什么需要这个功能,因为大多数计算机软件时钟系统通常只能有一个时钟触发一次中断。当运行多个任务时,我们会想要多个定时器 的时钟跟踪并发这样可以生成正确的时间重叠,操作系统这样做。本例子是为了实现使用Linux下的一个定时器,实现任一数量的定时器功能。首先我们需要一些数据类型用来描述时钟数据结构#include #include#define TRUE 1#define FALSE 0#define...

weixin_30531997的博客 630

避开这些坑!QMT多因子策略实盘中的5个常见错误及解决方案

本文深入剖析了在QMT平台上实施多因子策略时常见的5个错误,包括因子过拟合、数据延迟处理不当、因子失效、交易成本低估和风险控制缺失,并提供了实用的解决方案。通过优化因子筛选、数据对齐和动态管理,帮助量化交易者提升策略稳健性和实盘表现。

k5l6m的博客 238

从Verilog到GDS:手把手教你搞定Calibre LVS物理验证(附常见报错解决)

本文详细介绍了从Verilog到GDS的Calibre LVS物理验证全流程,包括工具链配置、RTL到SPICE网表转换、LVS运行配置及高级技巧。重点解析了常见报错如网络不匹配、器件不匹配和电源引脚缺失的解决方案,帮助工程师高效完成芯片物理验证,确保设计正确性。

culing2941的博客 507

完美定时器:高性能、可取消的 C++ 异步定时器最佳实践

本文介绍了基于ACE库的高性能C++异步定时器管理器,针对分布式系统和高频交易等场景需求。

jinnee_cumtb的专栏 707

Cadence Allegro 17.4学习记录开始02-原理图Capture CIS 17.4

Allegro的第一方网表与第三方网表有以下几个区别点;Ø 与Allegro实现交互式操作的是第一方网表,第三方网表时不可以实现交互式操作;Ø 第三方网表不能将器件的Value属性导入到PCB中,输出时以封装属性来代替Value属性,第一方网表是可以的;Ø 网表导入到PCB中时,第三方的网表需要指定事先指定好PCB封装库文件,并产生Device文件,才可以将网表导入到PCB中,第一方网表则可以直接导入。

qq_31444421的博客 1万+

C/C++跨平台定时器实现:时间轮算法与线程模型详解

定时器是计算机系统中用于调度任务在特定时间点或周期执行的核心组件,其原理基于时间管理和事件触发机制。在操作系统和网络编程中,定时器为心跳检测、超时控制、缓存清理等场景提供了基础支持,技术价值在于保障系统稳定性和实时性。常见的实现算法包括链表、最小堆和时间轮,其中时间轮算法因其在任务增删上接近O(1)的时间复杂度,在高并发场景下表现优异。通过将调度线程与任务执行线程分离的架构,可以进一步提升定时器的稳定性和吞吐量。本文以C/C++跨平台定时器为例,深入解析了时间轮算法的数据结构设计与线程模型,并探讨了其在网络

weixin_30326741的博客 472

基于大模型的围术期谵妄防控系统研究报告

围术期谵妄是一种急性脑功能障碍综合征,通常发生在手术前后一段时间内。患者会出现意识障碍、注意力不集中、认知功能紊乱、睡眠 - 觉醒周期失调等症状,严重者甚至会出现幻觉、妄想和攻击行为 。这种病症不仅会给患者自身带来极大的痛苦,还会对其术后康复产生严重的负面影响。从患者角度来看,围术期谵妄会显著延长患者的住院时间,增加患者的医疗费用负担。有研究表明,发生谵妄的患者住院时间平均比未发生者延长 2 - 3 天。长时间的住院不仅会影响患者的生活质量,还可能导致患者错过最佳的康复时机,影响身体机能的恢复。同时,谵妄还

嵌入式毕设/课设资料清单(速查手册·文档模板·题库,持续更新)→ 见最新文章 1071

01|无代码开发 | 如何使用Zion实现导航网站制作

以上就是我制作导航网站的心得,分享给大家,作为一个小白想要独立搭建一个网站还是比较困难的,而在Zion不仅可以用可视化的方法进行搭建,甚至还可以一键发布,不用考虑服务器域名啥的问题,真是太方便了。

2301_76262110的博客 1390

Qt开发人机象棋

文章目录Qt开发人机象棋1. 类关系图2. 用到的技术手段2.1 界面计算分离2.2 线程2.3 定时器3. Qt开发象棋过程问题记录3.1 问题 1. 在初次开发中存在内存泄漏问题3.2 问题 2. 类设计糟糕,使得计算和界面未分离3.3 问题 3. 重写项目后,效率降低了十倍3.4 问题 4. 信号和槽连接问题3.5 问题 5. 使用线程之后,界面频繁重绘4. 项目尚存在的问题4.1 算法问题4.2 程序完成性问题4.2 程序重绘问题5. 项目体验地址 Qt开发人机象棋 前段时间在网上看到有人在用qt做

BambooWine's Notes 2万+

GIS坐标系转换以及空间校正和地理配准

许多小伙伴都对坐标系,投影这类问题迷迷糊糊,我之前也一样,现在总结一下。 坐标系的转换1.为什么要进行坐标系的转换?2. 不同坐标系的介绍1.地理坐标系我国常见的地理坐标(1).北京54坐标系(2).西安80坐标系(3).WGS-84坐标系(4).大地2000坐标系2.投影坐标系我国常用的投影坐标系(1) UTM投影(2) 高斯-克吕格投影(3) 兰伯特投影(4) 阿尔伯斯投影投影坐标系的选择3. 坐标系的转换1.已知坐标系之间的转换1.1 两坐标系的参考椭球相同1.2 两坐标系的参考椭球不一致,但是GIS

m0_47258611的博客 8912

【Java面试】一年 工作经验必问面试题总结

最近有兄弟私信要Java一年经验面试的题,给大家总结一些1年问的比较多的面试题,有相关需求的弟兄们冲吧~

u013488276的博客 2013

大模型量化方法总结

本文主要对大模型量化方法进行了总结,希望对学习大语言模型的同学们有所帮助。 文章目录 1. 前言 2. 模型精度 3. 量化方法 3.1 方法一 3.2 方法二 3.3 方法三

herosunly的博客 1万+

matlab 一维相位解缠

一维相位解缠算法的matlab代码实现。

点云侠的博客 372

前端优化个人经验

以下为个人在平常工作中一些见解,不对之处多多给出宝贵意见。 项目: 静态资源分离,静态资源路径由前端配置(nodeJS,Nginx代理分发); 资源压缩:冗杂代码量减少(代码质量,代码重构还是必要),图片压缩和雪碧图,代码压缩 代码: 数据缓存和http缓存          对一些和采集不相关的数据只用在页面加载时请求一次,或利用http request的头  Last-Modifed属...

generalfyx的博客 219

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

定时器使用避坑指南:从原理到实践,防止线上服务雪崩

定时器(Timer)和调度器(Scheduler)是编程中用于执行周期性或延迟任务的核心组件,其原理基于时间轮或优先级队列等机制,在指定时间点触发回调函数。理解其单线程模型、时间漂移和异常处理机制,对于保障系统稳定至关重要。在工程实践中,定时器的技术价值在于实现自动化后台作业,如数据同步、缓存清理和报表生成,但若使用不当,极易引发资源耗尽、内存泄漏等线上事故。常见应用场景包括电商订单超时处理、系统监控心跳检测和日志文件轮转。本文聚焦于定时器在分布式环境下的资源管理与生命周期控制,通过剖析任务阻塞、异常吞噬等

weixin_29973493的博客 342

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

【记录】经验总结

基于PyQt5开发工业上位机测试软件,对接Jetson边缘端Redis视觉推理服务,实现双路AI检测报文解析、关键点与检测框图像绘制、双路RTSP视频流播放。采用QThread+信号槽多线程架构,把Redis订阅、SSH远程交互、视频解码放到子线程,解决高频消息UI卡顿。完成设备资源监控、告警日志解析、远程文件拉取,完善异常容错、日志、线程资源释放,保障工业场景软件稳定运行。使用PyQt5做工业上位机,主要对接边缘板的Redis视觉数据,做双路AI结果渲染、RTSP视频播放。

weixin_45939263的博客 347

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

QT定时器深度解析:QTimer与timerEvent机制对比与实战应用

在桌面应用和嵌入式开发中,定时器是实现周期性任务的核心组件,其本质是基于事件循环的时间触发机制。QT框架提供了两种定时方案:高级的QTimer类基于信号槽机制,封装了完整的定时器功能,适合独立任务和跨对象通信;而底层的timerEvent则是QObject的内置事件处理器,通过重写虚函数直接响应定时事件,适合对象内部多任务管理和性能敏感场景。理解这两种机制的原理差异,有助于在开发中根据任务特性做出合理选择,例如在需要集中管理多个定时任务或对性能有极致要求时,timerEvent能提供更直接的控制和更低的开销

weixin_30932215的博客 341

睡眠分析项目中遇到的问题以及经验总结

一.遇到的问题 1. 栈溢出 现象:程序运行到某一个函数时,程序退出,加断点也不能捕获到是哪句代码出了问题。 分析:在手机端平台,如果开辟一个几十K大小栈空间就会导致栈溢出,进入函数之前会先执行局部变量空间的分配等工作。但是在分配空间时就失败了,所以在函数里加断点也不能捕获

375
上一篇: 获得MFC窗口其它类指针的方法
下一篇: SendMessageTimeOut函数你使用过吗?
cbNotes
博客等级 码龄14年 295粉丝 57原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值