多媒体定时器

多媒体定时器

Windows定时器

  在以Windows以平台的实时控制系统中,常常需要定时或周期性的完成某个动作,采样时间的精度是系统得以正常运行的关键,对以Dos为平台的控制系统,可以通过对硬件的直接操作而得到精确的采样时间,而对于Windows平台,由于Windows平台为抢占式多任务操作系统,系统管理所有硬件资源,用户无法直接同硬件打交道,时间控制离不开操作系统的支持,因此,在Windows平台下如何精确的控制采样频率是一个很关键的技术。


一.普通定时器

  普通定时器是依赖消息机制的时间控制方法,首先由SetTimer函数创建一个内存对象,设定间隔时间,当到达要求的时间间隔时,计时器对象发送一个WM_TIMER消息,由相应函数处理,WM_TIMER消息优先级不高,且易出现消息合并情况,不能满足工业实时控制系统的要求。


二.多媒体定时器

  多媒体定时器不依赖消息机制,而是有TimeSetEvent()产生一个独立的线程,在一定的中断次数到达后,直接调用预先设置的回调函数进行处理,而不必等待应用程序的消息队列为空,保证的定时器的实时相应,是一种很理想的高精度定时器,可以实现精度为1ms的定时精度,相关的API如下:

1. MMRESULT timeGetDevCaps(

  LPTIMECAPS ptc, 

  UINT cbtc       

);

函数功能:获取定时器设备能力

参数:ptc指向一个TIMECAPS型的结构,TIMECAPS有两个成员,wPeriodMin和WperiodMax,表示定时器设备支持的最小时间周期和最大时间周期;cbtc表示TIMECAPS结构的大小

返回值:
2. MMRESULT timeBeginPeriod(

  UINT uPeriod 

);

函数功能:设置定时器设备的最小时间分辨率

参数:最小时间分辨率,以毫秒为单位
3. MMRESULT timeEndPeriod(

  UINT uPeriod 

);

函数功能:清除之前对定时器设备的设置

参数:timeBeginPeriod中指定的最小分辨率

注:

对定时器设备使用完成后,立刻调用这个函数,timeBeginPeriod和timeEndPeriod必须配对存在,并且指定的参数值也相同。
4. MMRESULT timeSetEvent(

  UINT           uDelay,     

  UINT           uResolution,

  LPTIMECALLBACK lpTimeProc, 

  DWORD_PTR      dwUser,     

  UINT           fuEvent     

);

函数功能:

创建并初始化定时器事件,给定定时器回调函数的入口地址

参数:

uDelay:定时器触发的时间间隔,以毫秒为单位

uResolution:定时器设备的时间精度,以毫秒为单位,应大于或等于timeBeginPeriod中设置的值,默认为1ms,精度越高,系统在定时器上的负载就越大,通常选择适合于应用程序的最大值

LpTimeProc:定时器触发的事件的回调函数的地址

dwUser:传递给回调函数的数据

fuEvent:定时类型,TIME_ONESHOT表示uDelay毫秒后只产生一次事件,TIME_PERIODIC表示每隔uDelay毫秒周期性的产生事件

返回值:返回定时器事件的ID
5. MMRESULT timeKillEvent(

  UINT uTimerID 

);

函数功能:删除一个指定的定时器事件

参数:指向要删除的定时器事件的ID

注:

timeSetEvent和timeKillEvent必须配对出现,释放系统为定时器分配的资源,定时器任务完成后,要及时删除定时器,否则占用太多内存,导致系统越来越慢。
6. void CALLBACK TimeProc(UINT uID,UINT uMsg,DWORD dwUsers,DWORD dw1,DWORD dw2);

函数功能:回调函数

参数:uID,多媒体定时器的ID,ID值由timeSetEvent创建定时器事件时返回

uMsg,保留,当前未使用

dwUser,由timeSetEvent传递的用户数据

dw1,dw2保留未使用

三.使用多媒体定时器的程序例子:

#include <Windows.h>

#include <MMSystem.h>

#include <iostream>

using namespace std;

#pragma comment(lib, "winmm.lib")

void CALLBACK TimeProc(UINT uID,UINT uMsg,DWORD dwUsers,DWORD dw1,DWORD dw2);

int main()

{

    UINT wTimerRes;

    UINT timerID;

    TIMECAPS ts;

    //确定多媒体定时器提供的最大和最小定时器事件周期

    timeGetDevCaps(&ts, sizeof(ts));

    wTimerRes = 1;

    //建立最小定时器精度

    timeBeginPeriod(wTimerRes);

    //启动定时器事件,设置定时周期为100ms,分辨率是10毫秒

    timerID = timeSetEvent(100,10,TimeProc,NULL,TIME_PERIODIC);

    Sleep(50000);

    //关闭定时器事件

    timeKillEvent(timerID);

    //清除最小定时器精度

    timeEndPeriod(wTimerRes);

    return 0;

};

void CALLBACK TimeProc(UINT uID,UINT uMsg,DWORD dwUsers,DWORD dw1,DWORD dw2)

{

    cout<<uID<<endl;

}

转自 http://www.cnblogs.com/liuhao2638/archive/2013/06/13/3134109.html

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以精确到1毫秒的定时器——多媒体定时器 主要用于数据采集。VB、VC 混合编程! 1、HighResolutionTimer 2、HL_mmTimer2 两者几乎一样,精度高,但都有个问题:一个进程中只能用一个此种控件! mmTimer_source.rar 是 mmTimer 控件的原版。 可以精确到1毫秒的定时器——多媒体定时器 ' *********************************************************************************** ' 功 能:可以精确到1毫秒的定时器——多媒体定时器 ' 特别注意:(一个工程中只能添加一个控件实例!第二个不执行,但不会导致程序崩溃!) ' 使用方法:方法一: ' 1、在窗体上添加此控件。 ' 2、调用函数 Init,设置时间间隔,并开启计时器! ' 3、在 Timer() 事件中添加执行代码。 ' 4、调用函数 Destroy,停止计时器。 ' 方法二: ' 1、在窗体上添加此控件。 ' 2、设置 Interval 属性。 ' 3、设置 Enabled 属性,开启或关闭计时器。 ' 4、在 Timer() 事件中添加执行代码。 ' 作 者:鹤望兰·流 ' 发布日期:2010-05-27 ' 网 站:http://hewanglan.ys168.com ' E - mail:hewanglan34512@163.com ' 依 赖:(HighResolutionTimer.ctx,HighResolutionTimer.dll,MhrtCallBack.bas) ' 更 新: ' * (******* 复制请保留以上信息 *******) ' ************************************************************************************** 本控件采用多媒体定时器包装而成,注意打包时带上"winmm.dll"。 为使VB6能用上它,用VC6封装出DLL,提供API接口,通过发送WM_KEYUP消息到VB6的用户控件触发计时事件! 超强Timer—— 用于需要对时间精确控制或者消息队列很忙的情况 http://blog.csdn.net/godwater8/archive/2007/04/10/1559458.aspx
### 回答1: "C",全称为 "C语言",是一种高级程序设计语言。它由贝尔实验室的Dennis Ritchie在20世纪70年代初开发,并在当时的DEC PDP-11计算机上首次实现。 C语言在计算机编程领域具有非常重要的地位。它被广泛用于开发系统软件、应用软件和嵌入式系统。C语言具有简洁、高效、灵活以及跨平台等特点,使得它成为了一门非常流行的编程语言。 使用C语言可以进行各种编程任务,例如数据处理、算法设计、内存管理和设备控制等。它提供了许多功能强大的库和工具,方便开发人员进行编码和调试。 C语言的语法清晰简洁,易于学习和理解。它不仅可以进行低级的硬件编程,还支持高级结构化编程。作为一门通用的编程语言,C语言以其跨平台性和高性能而广泛应用于各类计算机硬件平台。 此外,由于C语言的普及和广泛应用,许多其他编程语言(如C++、C#和Objective-C等)都借鉴了C语言的语法和特性。因此,掌握C语言不仅可以帮助学习其他编程语言,也是成为一名优秀程序员的重要基础。 总之,C语言是一种强大而受欢迎的编程语言,具有广泛的应用领域和重要的地位。掌握C语言可以帮助开发人员进行各种编程任务,并成为编程技能的重要基础。 ### 回答2: 对于“c”这个问题,根据我所理解的情况,我认为你可能是在请求我回答有关于“c”的任意一个主题。根据这个猜测,我将采取以下几个主题进行回答。 首先,我会选择回答关于编程语言C的主题。C是一种通用的、面向过程的编程语言,由贝尔实验室的丹尼斯·里奇在1972年开发。C在计算机编程历史上具有重要意义,因为它是许多其他编程语言的基础,包括C++、Java和Python等。C语言具有高效、快速和灵活的特点,适用于系统软件、嵌入式系统和其他需要高度控制的应用程序的开发。它是一种底层语言,程序员需要直接管理内存,但这也赋予了他们更大的灵活性和控制权。 其次,我可以回答关于化学元素C(碳)的主题。碳是化学元素周期表中的第六个元素,具有原子序数6和原子量12.01。它是地球上最丰富的元素之一,并且在生物体和有机化合物中扮演重要角色。碳是有机化学的基础,几乎所有的生物大分子都是由碳构成。例如,脂肪、蛋白质和核酸等生物大分子都含有大量的碳原子。碳的化学性质多样,可以形成单键、双键和三键等各种化学键,这使得它能够形成许多不同的化合物。 最后,我可以回答关于“C”作为罗马数字的主题。在罗马数字中,C代表数字100。罗马数字是一种古老的计数系统,使用拉丁字母表示数字。C在罗马数字中是一个较大的数字,表示100。在罗马数字中,还有其他的字母表示其他的数字,如I代表1,V代表5,X代表10,L代表50等等。 以上是我对于“c”这个问题的回答。根据上述猜测的主题,我希望这些回答能够满足你的需求。如果我的猜测与你的问题不符,请告诉我具体的问题,我会尽力给予解答。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值