高精确度且线程分离的定时器——多媒体定时器

说道定时器,很多人都会想到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>

时间: 2024-11-11 21:55:43

高精确度且线程分离的定时器——多媒体定时器的相关文章

Windows高速定时器,多媒体定时器winmm.dll库的使用

项目里面用到的这些看起来名字高大上的定时器测试下来也是非常不准.看了源码发现也是用System.Timers.Timer或者用的是Thread休眠的方式来实现的.100毫秒就不准了.直到一番搜索,发现利用多媒体定时器winmm.dll的MillisecondTimer是可用的.原文来自博客(dehai)Timer计时不准确的问题及解决方法”.代码如下: public sealed class MillisecondTimer : IComponent, IDisposable { //*****

VC++或QT下 高精度 多媒体定时器

在VC编程中,用SetTimer可以定义一个定时器,到时间了,就响应OnTimer消息,但这种定时器精度太低了.如果需要精度更高一些的定时器(精 确到1ms),可以使用下面的高精度多媒体定时器进行代码优化,可以达到毫秒级的精度,而且使用方便.先要包含头文件"mmsystem.h"和库文 件"winmm.lib". 虽然Win95下可视化开发工具如VC.Delphi.C++   Builder等都有专用的定时器控件Timer,而且使用很方便,可以实现一定的定时功能,但

linux线程控制&amp;线程分离

线程概念 线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元. 线程是程序中一个单一的顺序控制流程.进程内一个相对独立的.可调度的执行单元,是系统独立调度和分派CPU的基本单位指运行中的程序的调度单位.在单个程序中同时运行多个线程完成不同的工作,称为多线程. 线程资源 由于一个程序中的多个线程共享同一地址空间,因此代码段,数据段内容是共享的.除此之外,以下内容也是共享的: 1. 文件描述符表2. 每种信号的处理方式(SIG_IGN.SIG_DFL

HAProxy基于KeepAlived实现Web高可用及动静分离

    前言     软件负载均衡一般通过两种方式来实现:基于操作系统的软负载实现和基于第三方应用的软负载均衡.LVS是基于Linux操作系统实现的一种软负载,而Haproxy则是基于第三方应用实现的软负载.Haproxy相比LVS的使用要简单很多,但跟LVS一样,Haproxy自己并不能实现高可用,一旦Haprox节点故障,将会影响整个站点.本文是haprox基于keepalived实现web高可用及动静分离.     相关介绍         HAProxy     haproxy是一款提供

线程分离

线程分离的作用:当主线程与新线程无关时,主线程无需等待新线程的结束. 1.进程属性初始化 pthread_attr_t pth_attr; pthread_attr_init(&pth_attr);2.进程分离属性设置. pthread_attr_setdetachstate(&pth_attr,PTHREAD_CREATE_DETACHED); 3.进程创建. 4.进程属性资源回收. pthread_attr_destroy(&pth_attr); #include<std

php BC高精确度函数库

<?php *************************************************************************************** *php BC高精确度函数库 *php bc math 包含了:相加,比较,相除,相减,求余,相乘,n次方,配置默认小数点数目,求平方 *这些函数在涉及到有关金钱的计算时比较有用 ******************************************************************

线程分离设置

PTHREAD_ATTR_SETDETACHSTATELinux Programmer's MaPTHREAD_ATTR_SETDETACHSTATE(3) NAME        pthread_attr_setdetachstate,   pthread_attr_getdetachstate   -  set/get        detach state attribute in thread attributes object SYNOPSIS        #include <pth

C# 线程(六):定时器

From : http://kb.cnblogs.com/page/42532/ Timer类:设置一个定时器,定时执行用户指定的函数. 定时器启动后,系统将自动建立一个新的线程,执行用户指定的函数. 初始化一个Timer对象: Timer timer = new Timer(timerDelegate, s,1000, 1000); // 第一个参数:指定了TimerCallback 委托,表示要执行的方法: // 第二个参数:一个包含回调方法要使用的信息的对象,或者为空引用: // 第三个参

HAProxy+KeepAlived实现web服务高可用、动静分离等

大致规划: 主机 IP 描述 VIP 192.168.0.222 对外提供高可用IP haproxy+keepalived (node1) 192.168.0.111 haproxy为后端两台WEB服务的做动静分离:keepalived为haproxy做高可用. haproxy+keepalived (node2) 192.168.0.112 WEB                (node3) 192.168.0.113 提供静态请求响应 Apache+PHP+MySQL   (node4)