第六篇 Windows定时器

针对windows系统的高精度定时器 背景  在实际工作过程中,比如与硬件交互、媒体视频播放、性能分析以及多线程任务同步时,可能需要在windows平台下实现ms级别精度的定时器。然而,这种需求虽然存在,但是由于windows系统并不是一个实时操作系统,实现这种精度的定时器,并不是一件容易的事情。 Windows 不是实时操作系统,所以任何方案都无法绝对保证定时器的精度,只是能尽量减少误差。所以,系统的稳定性不能完全依赖于定时器,必 阅读详情

大家都知道在8086汇编中,我们可以直接利用int 8h中断来达到计时的目的。显然,Win32

编程是不会直接让用户来操作中断的。Windows提供了定时器来达到相同的目的。

当用户需要使用定时器时,要向Windows申请,SetTimer;结束时,需要释放,KillTmer。

需要注意的是,Windows定时器还是基于时钟中断的,所以精度是55ms。如果用户设定一个

任意时间产生中断,则可能存在一定的误差。

 

用法参见代码:

一、资源文件定义

#include		<resource.h>
#define	DLG_MAIN	1
#define	ICO_1		1
#define	ICO_2		2
#define	IDC_SETICON	100
#define	IDC_COUNT	101

ICO_1	ICON	"1.ico"
ICO_2	ICON	"2.ico"

DLG_MAIN	DIALOG	50,50,113,40
STYLE	DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "定时器例子"
FONT 9,"宋体"
{
	ICON ICO_1,IDC_SETICON,8,9,18,21
	LTEXT "计数:",-1,35,16,25,10
	LTEXT "",IDC_COUNT,62,16,40,10
}

 

二、主体代码

.386
.model	flat,stdcall
option	casemap:none

include		windows.inc
include		user32.inc
includelib	user32.lib
include		kernel32.inc
includelib	kernel32.lib

ID_TIMER1	equ	1
ID_TIMER2	equ	2
ICO_1		equ	1
ICO_2		equ	2
DLG_MAIN	equ	1
IDC_SETICON	equ	100
IDC_COUNT	equ	101

.data
hInstance	dd	?
hWinMain	dd	?
dwCount		dd	?
idTimer		dd	?

.code
_ProcTimer	proc	_hWnd,uMsg,_idEvent,_dwTime
	
	pushad
	invoke	GetDlgItemInt,hWinMain,IDC_COUNT,NULL,FALSE
	inc	eax
	invoke	SetDlgItemInt,hWinMain,IDC_COUNT,eax,FALSE
	popad
	ret
_ProcTimer	endp

_ProcDlgMain	proc	uses	ebx edi esi,hWnd,uMsg,wParam,lParam
	
	mov	eax,uMsg
	.if	eax == WM_TIMER
		mov	eax,wParam
		.if	eax == ID_TIMER1
			inc	dwCount
			mov	eax,dwCount
			and	eax,1
			inc	eax
			invoke	LoadIcon,hInstance,eax
			invoke	SendDlgItemMessage,hWnd,\
				IDC_SETICON,STM_SETIMAGE,\
				IMAGE_ICON,eax
		.elseif	eax == ID_TIMER2
			invoke	MessageBeep,-1
		.endif
	.elseif	eax == WM_INITDIALOG
		push	hWnd
		pop	hWinMain
		invoke	SetTimer,hWnd,ID_TIMER1,250,NULL
		invoke	SetTimer,hWnd,ID_TIMER2,2000,NULL
		invoke	SetTimer,NULL,NULL,1000,addr _ProcTimer
		mov	idTimer,eax
	.elseif	eax == WM_CLOSE
		invoke	KillTimer,hWnd,ID_TIMER1
		invoke	KillTimer,hWnd,ID_TIMER2
		invoke	KillTimer,NULL,idTimer
		invoke	EndDialog,hWnd,NULL
	.else
		mov	eax,FALSE
		ret
	.endif
	
	mov	eax,TRUE
	ret

_ProcDlgMain	endp

start:
	invoke	GetModuleHandle,NULL
	mov	hInstance,eax
	invoke	DialogBoxParam,hInstance,DLG_MAIN,\
		NULL,offset _ProcDlgMain,NULL
	invoke	ExitProcess,NULL

	end	start

 

三、运行截图

 

四、资源文件下载

1.ICO    2.ICO

 

 

windows 定时器不准确 时间补偿方案 windows 定时器 问题 阅读详情

相关推荐

C++实现Windows微秒级高精度定时器的方法详解

Windows操作系统提供了多种定时器机制,以满足不同应用场景对时间精度的需求。从系统时钟到高精度可等待定时器,每种机制都有其特定的精度范围和适用场景。系统时钟(System Clock):基于中断驱动,精度通常在10-15毫秒左右,适用于一般性定时任务。多媒体定时器(Multimedia Timer):通过实现,精度可达1毫秒,适合音视频等对时间敏感的应用。可等待定时器(Waitable Timer):支持高精度定时与线程同步,适用于多线程环境下的定时控制。

weixin_42603332的博客 1935

高分辨率计时器

以前的版本应该是驱动下都可以用高精度,应用态下是低精度;现在变了,应该是微软要把 系统 高精度定时器管控起来,驱动下面也要用特定接口才行。win10 64位下SetTimer设置的时间与延时的精确度均误差15ms,win10 32位下可以做到2ms精确时间。修改win10 64位下的时针为高精度定时可以精确到ms。但是高精度定时这个数据类型是win8以后的版本才支持,所以在wdk7600编译都不能识别,把驱动移到VS2019上去编译才可以。编译后的驱动文件win10的32位,64位上面测试都正常了。

sanfenlu的专栏 2432

VS2010在Win32控制台使用定时器实例

基本网上很多定时器都是用MFC写的,而用win32方面比较少,项目用到定时器这块,所以顺便上传一份. 是在VS2010 --> VC++ --> Win32控制台建的工程.里面涉及线程/定时器,简单易用,下载完可直接运行.

Windows实现高精度定时器的三种方法

前段时间一个项目需要用到1/24s的高精度定时器,每秒的误差不能超过10ms,大约41.666666666毫秒的延时,普通Sleep肯定是没办法满足的了,可以用以下新的三种方法: /* // 1秒=1000毫秒(ms) // 1毫秒=1/1000秒(s) // 1秒=1000000 微秒(μs) // 1微秒=1/1000000秒(s) // 1秒=1000000000 ...

Koma的主页 3万+

Windows高精度定时器(VC++实现)

Windows平台高精度定时器封装类,最高精度可达1ms。

vc++2005定时器settimer()的使用

vc++2005定时器settimer()的使用 查了一些资料,写了个简单的程序

构建64位操作系统-高精度定时器与定时机制

构建64位操作系统-高精度定时器与定时机制

x13262608581的博客 1237

磁盘I/O %util特别高

磁盘I/O %util特别高

eagle89的专栏 3094

第三篇 SG90舵机和HC-SR04测距

目录 一、SG90舵机 1、PWM 2、占空比 3、输出PWM的方式 4、编程实现舵机0-135°转动(demo1.c) 二、HC-SR04测距 1、测距原理 2、测距实现(demo2.c) 一、SG90舵机 SG90舵机的控制信号是PWM信号,利用占空比的变化,改变舵机转动的角度。 1、PWM 脉冲宽度调制 (Pulse Width Modulation)<详细解释见百度> 2、占空比 一个周期内,高电平占据时长的百分比 3、输出PWM的方式 🔖硬...

AF_INET6的博客 2384

Aurora8b10b光口通信实战:复位时序与IP核配置详解

本文深入解析了Aurora 8B10B协议在FPGA高速光口通信中的核心实践,重点剖析了确保链路稳定启动的关键复位时序与IP核配置细节。通过详解全双工与单工模式下的复位流程、Vivado中IP核的物理层与链路层参数设置,并结合用户逻辑设计实例,为工程师实现可靠的高速数据传输提供了清晰的实战指南。

weixin_29280219的博客 178

Windows非分页缓冲池内存泄漏实战:PoolMon与RAMMap高效排查指南

本文详细介绍了Windows系统中非分页缓冲池内存泄漏的实战排查方法。当系统出现卡顿且内存占用异常增长时,通过RAMMap工具快速定位非分页缓冲池异常,并利用PoolMon监控内核内存分配标签,精准锁定泄漏源。文章提供了从确认症状、安装工具到使用findstr命令溯源驱动文件的完整五步排查流程,并总结了常见泄漏标签与解决方案,帮助用户高效解决深层系统内存问题。

weixin_28455801的博客 1014

WF工作流入门:从纯代码Hello World理解执行模型与持久化

工作流引擎是现代自动化系统的核心基础设施,其本质在于解耦业务逻辑与执行调度。理解工作流的生命周期管理、状态持久化机制和异常边界定义,是构建高可靠流程系统的前提。Windows Workflow Foundation(WF)虽为.NET经典框架,但其提出的Bookmark等待点、WorkflowApplication事件驱动模型、实例持久化契约等核心设计思想,深刻影响了Airflow、BPMN.js乃至云原生编排服务的演进路径。本文以纯C#代码实现可调试、可观测、可持久化的Hello World流程为切入点,

diaozhiwa5526的博客 409

麒麟操作系统安装达梦数据库ARM版

Linux安装达梦数据库ARM版

运维@小兵的博客 8771

Windows中的精度定时问题

Windows中的精度定时问题   在Windows中,可以使用不同精度的定时器来满足不同的要求: 1、使用Timer组件   它其实是先调用SetTimer()函数建立一个定时器,然后每隔一定的时间向Windows发送一个WM_TIMER的消息,操作系统捕获此消息后处理相应的事件。但是由于Windows的定时器是建立在DOS的1CH的中断基础上的,而此中断的响应频率是每秒18.2次,所以T

moshang005的专栏 4250

ENVI5.6 批量处理GF-2/GF-6/GF-7:从安装到融合的完整自动化流程

本文详细介绍了ENVI5.6环境下批量处理GF-2/GF-6/GF-7卫星数据的完整自动化流程,包括环境配置、工具安装、正射校正、图像融合等关键步骤。通过实战案例和优化技巧,帮助用户高效完成高分卫星影像处理,提升工作效率。特别针对GF-6和GF-7的特殊处理要点进行了深入解析。

weixin_42546392的博客 179

数据资产目录(SailCatalog)和数据地图(SailMap)

笔者接下来准备开发大数据平台(XSailboat)中的数据资产目录(SailCatalog)和数据地图(SailMap)相关的功能,本文用以记录笔者关于此部分功能的概念梳理和主体功能设计。

OkGogooXSailboat的博客 2327

windows下使用C++高精度定时器

1.添加winmm.lib。

weixin_46739825的博客 813

寻迹Arduino智能小车

Arduino巡线寻迹智能小车

Rachael_Wang的博客 1万+

Windows系统的线程调度与软件中断分发

在Windows操作系统内核把软件中断分为三个中断级别:DISPATCH_LEVEL,APC_LEVEL,PASSVIE_LEVEL。同时他们与线程的调试相关,WINDOWS内核中没有一个专门的程序来做线程的调度工作,它是散落在系统各个部分的。总结一下主要以下几种情况。

lziog的专栏 2778

Android Studio无法启动,Failed to create JVM:error code -1. JVM Path 完美解决方案

Android Studio无法启动,Failed to create JVM:error code -1. JVM Path 完美解决方案。 找到Android studio的启动文件bin目录,把studio64.exe.vmoptions 删除或改名(推荐改名,方便恢复),如果你是32位系统这个文件就是 studio.exe.vmoptions

陈万洲的专栏 4850

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

windows定时器的总结

windows定时器的总结   (2011-09-20 10:44:09) 标签:  杂谈 分类: c#方面的总结 定时器的总结 昨天突然遇到定时器到底是如何实现的这个问题,一个本来很浅显的东西,立刻变得含混起来,回家查了LINXU内核的定时器实现机制,非但没有弄清楚,倒好,更糊涂了。 在LINUX下,使用了硬件计时器进行

lyq240919525的专栏 3203

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Windows下的高精度定时器实现及精确时刻获取

通讯、VOIP、视频等领域的很多核心技术对时间精度的要求非常高,比如数据采集、时间同步、媒体流平滑控制、拥塞算法等等,很多技术都是以毫秒为单位来进行计算和控制的。但是Windows设计之初并不是以实时系统为目标的,所以Windows系统的时间精度一直不高,实际最小单位是15ms左右,导致的结果就是所有Windows的时间、线程相关的操作都无法以1ms来实现精确控制。           受影响

singebogo的博客 2301

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Windows高精度微秒级(并发)定时器实现

自从上次封装微秒延时函数后,利用空闲时间试着封装一个微秒定时器(类似MFC定时器形式)使用起来效果还不错。关于定时器的几点介绍: 1.设计采用了自动释放定时器节点方式(增加虚析构函数在内部做相关释放判断,即使用完不释放节点也没关系); 2.设计采用了双向链表方式做定时器节点(为了方便起见,没有采用环形双向链表); 3.增加了第三参数为回调函数(采用MFC风格,如果第三个

大昱的博客 1万+

高精度定时器(Windows)

一个高精度定时器的C++实现。 下载地址:http://download.youkuaiyun.com/detail/fdsdfdsf/6837703

勿在浮沙筑高台 3142

windows c定时函数的使用

一、介绍 对应时间函数,c语言有标准库,但是要一直阻塞读取,这里介绍一种类似中断的处理方法,设置时间,时间到以后直接跳转到自己设定的函数里面执行,执行完以后返回当之前 的代码 这里使用的ide:DEV C++ 二、函数介绍 MMRESULT timeSetEvent( UINT uDelay , UINT uResolution ,

锅锅的博客 1312
上一篇: 通过命令行开启和结束应用程序
下一篇: 第七篇 GDI编程
lulipeng_cpp
博客等级 码龄15年 169粉丝 130原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值