精华内容
下载资源
问答
  • VC6.0多媒体定时器多个

    热门讨论 2012-03-09 20:03:02
    使用VC6.0开发的高精度多媒体定时器,这里创建了多个定时器。并控制对话框资源。
  • 多媒体定时器

    千次阅读 2016-08-18 10:24:15
    一、简介 在工业生产控制系统中,有许多需要定时完成的操作,如数据采集程序。Win32提供了一个基于消息机制的定时器,使用SetTimer函数创建一个内存对象,设定间隔...而且消息队列中的多个WM_TIMER会被合并,因此Win

    一、简介

    在工业生产控制系统中,有许多需要定时完成的操作,如数据采集程序。Win32提供了一个基于消息机制的定时器,使用SetTimer函数创建一个内存对象,设定间隔时间,当到达要求的间隔时,计时器对象发送一个WM_TIMER消息,由相应函数处理。但是由于WM_TIMER优先级低,只有等待消息队列中的其他消息都处理完毕后系统才会响应该消息。而且消息队列中的多个WM_TIMER会被合并,因此Win32定时器的精度低,不能满足工业实时控制系统的要求。

    本文将介绍一种精度较高的多媒体定时器,该定时器并不依赖于消息机制,可以实现1ms的定时精度。由于多媒体定时器另外开辟一个独立线程执行定时器回调函数,因此当回调函数耗时较多时并不会导致UI的“假死”,相对而言,Win32定时器隶属于主线程,一旦定时器回调函数耗时较多,就会导致UI的“假死”。

    多媒体定时器相关API如下:

    MMRESULTtimeGetDevCaps(

        LPTIMECAPSptc,

        UINTcbtc      

        );

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

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

    MMRESULTtimeBeginPeriod(

        UINTuPeriod

        );

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

    参数:最小时间分辨率,以毫秒为单位

    MMRESULTtimeEndPeriod(

        UINTuPeriod

        );

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

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

    注:timeBeginPeriod和timeEndPeriod必须配对存在,并且指定的参数值也相同。

    MMRESULTtimeSetEvent(

        UINT          uDelay,    

        UINT          uResolution,

        LPTIMECALLBACKlpTimeProc,

        DWORD_PTR     dwUser,    

        UINT          fuEvent    

        );

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

    参数:

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

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

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

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

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

    MMRESULTtimeKillEvent(

        UINTuTimerID

        );

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

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

    void CALLBACKTimeProc(UINTuID,UINTuMsg,DWORDdwUsers,DWORDdw1,DWORDdw2);

    函数功能:回调函数

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

    uMsg,保留,当前未使用

    dwUser,由timeSetEvent传递的用户数据

    dw1,dw2保留未使用

    二、实现

    本程序将多媒体定时器封装成一个类MMTimer,下面是核心代码:

    #pragma once
    #include <mmsystem.h>
    #pragma comment(lib,"winmm.lib")
    typedef void (*TIMERCALLBACK)(DWORD);	//函数的指针
    class MMTimer
    {
    public:
    	MMTimer();
    	~MMTimer();
    	bool Start(UINT Delay,UINT Resolution,TIMERCALLBACK lpTimeProc,DWORD fParam);
    	void Stop();
    private:
    	bool m_RunningFlag;
    	UINT m_ID;
    	UINT m_Delay;
    	TIMERCALLBACK m_pfCallback;
    	DWORD m_Fparam;
    	static void CALLBACK TimeProc(UINT uID, UINT uMsg, DWORD dwUser, DWORD dw1, DWORD dw2);
    };
    #include "stdafx.h"
    #include "MMTimer.h"
    MMTimer::MMTimer()
    {
    	m_pfCallback=NULL;
    	m_Fparam=0;
    	m_RunningFlag=false;
    	m_Delay=0;
    	m_ID=0;
    }
    
    MMTimer::~MMTimer()
    {
    	if (m_RunningFlag)
    	{
    		Stop();
    	}
    }
    void MMTimer::TimeProc(UINT uID, UINT uMsg, DWORD dwUser, DWORD dw1, DWORD dw2)
    {
    	MMTimer *ptimer=(MMTimer*)dwUser;
    	(ptimer->m_pfCallback)(ptimer->m_Fparam);
    }
    
    bool MMTimer::Start(unsigned int Delay,unsigned int Resolution,TIMERCALLBACK lpTimeProc,DWORD fParam)
    {
    	bool Result = true;
    	if (!m_RunningFlag)
    	{
    		m_pfCallback=lpTimeProc;
    		m_Fparam=fParam;
    		if ((m_ID=timeSetEvent(Delay,Resolution,TimeProc,(DWORD)(this), TIME_PERIODIC))!=NULL)
    		{
    			m_RunningFlag=true;
    
    		}
    		else
    		{
    			Result=false;
    		}
    	}
    	 return Result;
    }
    
    void MMTimer::Stop()
    {
    	if (m_RunningFlag)
    	{
    		timeKillEvent(m_ID);
    		m_RunningFlag=false;
    	}
    }
    

    为了对比多媒体定时器与Win32定时器的精度,我们实现了一个测试软件,即定时器指定一个时间间隔(单位:ms),再测试出真实的时间间隔(采用高精度计时函数QueryPerformanceFrequency和QueryPerformanceCounter),下面是测试结果,可以发现win32定时器设定1ms间隔,但实际时间间隔为15.6ms,而多媒体定时器设定1ms,真实的时间间隔就是1ms 。

    三、相关问题

    (1)如何在回调函数中调用类内成员

    void CALLBACKTimeProc(UINTuID,UINTuMsg,DWORDdwUsers,DWORDdw1,DWORDdw2);

    可以将TimeProc声明为全局函数,但通常会将其放入类中,如本程序就将其放入MMTimer类中。此时需要将其声明为static类型(因为非静态成员函数的指针与静态成员函数的指针是不同的,主要是由于非静态成员函数的参数中隐含一个this指针,导致函数指针的类型不匹配)。

    然而将TimeProc声明为static,它只能访问类中的静态成员(变量与函数),这里的解决方法是利用参数dwUsers,改参数对应timeSetEvent中的dwUser,我们将自定义类MMTime的this指针作为参数传进TimeProc函数中:

    timeSetEvent(Delay,Resolution,TimeProc,(DWORD)(this),TIME_PERIODIC)

    然后在TimeProc中使用该this指针就可以调用类中的任意成员。

    (2)多媒体定时器属于多线程的验证如下:

    在VS中加断点调试,并选择调试->窗口->线程,可以发现当开启一个定时器后,会出现一个工作线程


    更正-----2017.1.15

    多媒体定时器回调函数应更正为:

    typedef void (CALLBACKTIMECALLBACK)(UINT uTimerID, UINT uMsg, DWORD_PTR dwUser, DWORD_PTR dw1,DWORD_PTR dw2);

    timeSetEvent调用时也相应做更改:


    DWORD_PTR是DWORD型指针,其字节数与sizeof(void*)相同,我们都知道,sizeof(void*)大小是平台相关的。在VS中将解决方案平台设为Win32,sizeof(void*)=4,设为X64,则sizeof(void*)=8.

    故之前用DOWRD类型传递指针是存在极大风险的,在X64下指针为8字节但DWORD只有4字节,这样就可能出现如下运行错误:



    同样的Win32定时器回调函数第三个参数也应该为UINT_PTR才能在x64下编译通过。


    源码已更新!


    源码下载


    参考:

    [1]http://www.cnblogs.com/liuhao2638/archive/2013/06/13/3134109.html

    [2] http://www.codeproject.com/Articles/1236/Timers-Tutorial



    展开全文
  • 例子使用了多媒体定时器,并且在界面上面显示多媒体定时器和普通定时器的效果对比,最后显示在毫秒级别的任务,多媒体定时器任务比普通定时器精度更高;
  • C#版本多媒体定时器

    热门讨论 2011-12-01 09:31:02
    MmTimer 是一个多媒体定时器的C#简单封装。 使用这个定时器,你可以得到1ms精度的单次延时或周期定时。最初是想用来做播放midi文件的时钟,当然你也可以用它来做任何它能做到的事情。
  • 一、多媒体定时器的使用多媒体定时器不依赖消息机制,而是有TimeSetEvent()产生一独立的线程,在一定的中断次数到达后,直接调用预先设置的回调函数进行处理,而不必等待应用程序的消息队列为空,保证的定时器的...

    一、多媒体定时器的使用

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

    1.多媒体定时器的使用

    首先要包含MMSystem.h头文件,还要添加以下代码
    #pragma comment(lib,"winmm.lib")
    

    启动多媒体定时器原型

    MMRESULT timeSetEvent( UINT uDelay, UINT uResolution, LPTIMECALLBACK lpTimeProc, WORD dwUser, UINT fuEvent )

    参数说明:
    uDelay:以毫秒指定时的周期
    Uresolution:以毫秒指定延时的精度,数值越小定时器事件分辨率越高。缺省值为1ms。
    LpTimeProc:指向一个回调函数,该回调函数包含需要定时执行的代码。
    DwUser:存放用户提供的回调数据。
    FuEvent:指定定时器事件类型:
    TIME_ONESHOT:uDelay毫秒后只产生一次事件。
    TIME_PERIODIC :每隔uDelay毫秒周期性地产生事件。

    例:
    UINT TimerID = timeSetEvent(1,1(LPTIMECALLBACK)MMTimerProc,(DWORD)this,TIME_PERIODIC);

    停止多媒体定时器
    timeKillEvent(TimerID);

    多媒体定时器回调函数

    void CALLBACK CMMTimerDlg::MMTimerProc(UINT uID,UINT uMsg,DWORD dwUsers,DWORD dw1,DWORD dw2)
    {
        CXXX *pDlg = (CMMTimerDlg*)(dwUsers);
        //添加你的代码
    }

    此函数一定要声明为静态函数

    二.普通定时器

    开启普通定时器原型
    UINT SetTimer(UINT nIDEvent,UINT nElapse,void ( CALLBACK* lpfnTimer )(HWND, UINT,UINT,DWORD) = NULL )

    参数说明:
    nIDEvent:非0值标识Timer的id 。
    nElapse:以毫秒为单位的定时间隔时间
    lpfnTimer 指向定时事件到达时调用的函数的指针,如果为NULL,那么调用WM_TIMER响应函数OnTimer()。

    例:
    SetTimer(1,200,NULL); //设置并启动一个时间间隔为200ms的定时器。消息响应函数为OnTimer()
    SetTimer(2,1000, TimerProc ); //设置并启动一个实间间隔为1s的定时器,该定时器的响应函数为TimerProc。

    停止定时器
    KillTimer(TimerID); //TimerID为要结束的定时器ID号

    普通定时器回调函数

    若SetTimer第三个参数为NULL则不需要自己写回调函数,定时器时间到将产生WM_TIMER消息

    自己定义回调函数
    例:
    SetTimer(1,1,(TIMERPROC)WMTimerProc);

    void CALLBACK CMMTimerDlg::WMTimerProc(HWND hwnd,UINT uMsg,UINT idEvent,DWORD dwTime)
    {
        CMMTimerDlg *pDlg = (CMMTimerDlg*)(AfxGetApp()->m_pMainWnd);
       //添加你的代码
    }

    三、多媒体定时器与普通定时器比较

    定时周期1ms
    定时周期1ms

    定时周期10ms
    定时周期10ms

    定时周期100ms
    定时周期100ms

    定时周期1000ms
    定时周期1000ms

    我们可以看到普通定时器根本无法达到1ms的分辨率,12多秒过去了才产生700多个中断。
    当定时周期大于100ms时,普通定时器才处于可用状态
    当定时周期大于1秒时,普通定时器与多媒体定时器相差不大
    所以当你需要定时的周期小于1秒时,还是建议使用多媒体定时器。定时精度相当高,官方称可以达到1ms的精度。实测基本属实。

    展开全文
  • 使用多媒体定时器的例子.一使用多媒体定时器的例子.
  • Windows多媒体定时器(精确到1ms)

    千次阅读 2017-04-07 18:59:54
    MFC使用多媒体定时器,Windows多媒体定时器多媒体定时器封装

    MSDN  多媒体地址 :https://msdn.microsoft.com/en-us/library/windows/desktop/dd757634(v=vs.85).aspx

    我的经验:我把MSDN上多媒体定时器的相关文档看完了。 就上面的这个 链接才是核心。 


    ------------------先看看下面的这个(转载别人的)-------------------

    一、多媒体定时器的使用

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

    1.多媒体定时器的使用

    首先要包含MMSystem.h头文件,还要添加以下代码
    #pragma comment(lib,"winmm.lib")
    

    启动多媒体定时器原型

    MMRESULT timeSetEvent( UINT uDelay, UINT uResolution, LPTIMECALLBACK lpTimeProc, WORD dwUser, UINT fuEvent )

    参数说明: 
    uDelay:以毫秒指定时的周期 
    Uresolution:以毫秒指定延时的精度,数值越小定时器事件分辨率越高。缺省值为1ms。 
    LpTimeProc:指向一个回调函数,该回调函数包含需要定时执行的代码。 
    DwUser:存放用户提供的回调数据。 
    FuEvent:指定定时器事件类型: 
    TIME_ONESHOT:uDelay毫秒后只产生一次事件。 
    TIME_PERIODIC :每隔uDelay毫秒周期性地产生事件。

    例: 
    UINT TimerID = timeSetEvent(1,1(LPTIMECALLBACK)MMTimerProc,(DWORD)this,TIME_PERIODIC);

    停止多媒体定时器 
    timeKillEvent(TimerID);

    多媒体定时器回调函数

    void CALLBACK CMMTimerDlg::MMTimerProc(UINT uID,UINT uMsg,DWORD dwUsers,DWORD dw1,DWORD dw2)
    {
        CXXX *pDlg = (CMMTimerDlg*)(dwUsers);
        //添加你的代码
    }

    此函数一定要声明为静态函数

    二.普通定时器

    开启普通定时器原型 
    UINT SetTimer(UINT nIDEvent,UINT nElapse,void ( CALLBACK* lpfnTimer )(HWND, UINT,UINT,DWORD) = NULL )

    参数说明: 
    nIDEvent:非0值标识Timer的id 。 
    nElapse:以毫秒为单位的定时间隔时间 
    lpfnTimer 指向定时事件到达时调用的函数的指针,如果为NULL,那么调用WM_TIMER响应函数OnTimer()。

    例: 
    SetTimer(1,200,NULL); //设置并启动一个时间间隔为200ms的定时器。消息响应函数为OnTimer() 
    SetTimer(2,1000, TimerProc ); //设置并启动一个实间间隔为1s的定时器,该定时器的响应函数为TimerProc。

    停止定时器 
    KillTimer(TimerID); //TimerID为要结束的定时器ID号

    普通定时器回调函数

    若SetTimer第三个参数为NULL则不需要自己写回调函数,定时器时间到将产生WM_TIMER消息

    自己定义回调函数 
    例: 
    SetTimer(1,1,(TIMERPROC)WMTimerProc);

    void CALLBACK CMMTimerDlg::WMTimerProc(HWND hwnd,UINT uMsg,UINT idEvent,DWORD dwTime)
    {
        CMMTimerDlg *pDlg = (CMMTimerDlg*)(AfxGetApp()->m_pMainWnd);
       //添加你的代码
    }

      先把这些概念 了解下。


    问题描述:

              现在用定时器,定时发送数据,精度 越高越好。

               环境:Windows



           拿起了 MFC ,做了个了例子。试试自己捣鼓了半天定时器的结果

         --------------------------------- 我自己封装的------------------------

     1、先看看源码吧。 

            我自己定义了一个类,把定时器封装起来了。方便使用。

           文件名:timer.h

    #pragma once
    #include "stdafx.h"
    #include <Mmsystem.h>
    #include <Windows.h>
    
    #pragma comment(lib,"Winmm.lib")
    
    
    class Timer
    {
    public:
    	Timer();
    	~Timer();
    
    	// 创建了,定时器就启动了
    	bool Creat(UINT n, UINT period, LPTIMECALLBACK callBack, DWORD dwuser);
    
    	// 停止定时器
    	bool Stop();
    
    	// 返回定时器创建标识
    	bool GetIsCreateFlag();
    
    private:
    
    	MMRESULT mm;
    
    	// true:定时器创建成功, false, 定时器没有创建
    	bool isCreate;
    };
    



           文件名:timer.cpp

    #include "stdafx.h"
    #include "timer.h"
    
    
    Timer::Timer()
    {
    	this->isCreate = false;
    }
    
    
    Timer::~Timer()
    {
    	
    }
    
    
    
    // 创建定时器
    bool Timer::Creat(UINT n, UINT period,  LPTIMECALLBACK callBack, DWORD dwuser)
    {
    	this->mm = timeSetEvent(n, period, (LPTIMECALLBACK)callBack, (DWORD)this, TIME_PERIODIC);
    
    	TRACE("\n-----------------定时器创建成功----------------\n");
    	this->isCreate = true;
    
    	return true;
    }
    
    // 终止定时器
    bool Timer::Stop()
    {
    	if (this->isCreate)
    	{
    		timeKillEvent(this->mm);
    		TRACE("\n-----------------定时器销毁成功----------------");
    		return true;
    	}
    
    	return false;
    }
     
    
    bool Timer::GetIsCreateFlag()
    {
    	return this->isCreate;
    }
    
    



        2、使用定时器

               A、界面 ,准备了一个按钮。



          然后,在界面所在对话框头文件中定义了一个回调函数,回调函数要定义成 静态, 原型如下:

    	// 定时器回调函数
    	static void CALLBACK OnSend(UINT uID, UINT uMsg, DWORD dwUser, DWORD dw1, DWORD dw2 );
        参数有点多, 不过,好像都没用到。

              

          接着 定义了一个定时器对象

         Timer *mTimer; 


          源码

    	// 定时器回调函数
    	static void CALLBACK OnSend(UINT uID, UINT uMsg, DWORD dwUser, DWORD dw1, DWORD dw2 );
    
    
    private:
    	Timer *mTimer;


           B、定时器实现

    void CALLBACK CtableDemoDlg::OnSend(UINT uID, UINT uMsg, DWORD dwUser, DWORD dw1, DWORD dw2)
    {
    	AfxMessageBox(L"定时器被调用了");
    }


          C、定时器使用就更简单了,在 click按钮事件下:

    	// TODO: 在此添加控件通知处理程序代码
    	mTimer = new Timer;
    	mTimer->Creat(5000, 0, OnSend, NULL);

          D、后来,我又添加了一个按钮,停止定时器用的,停止定时器按钮事件:

    	// TODO: 在此添加控件通知处理程序代码
    	if (this->mTimer->GetIsCreateFlag())
    	{
    		if (this->mTimer)
    		{
    			this->mTimer->Stop();
    			delete this->mTimer;
    			this->mTimer = NULL;
    		}
    	}

          

    -----------------------  有时,我也忘了-----------------------

      我也会忘了 手动终止定时器。 定义定时器的时,定义为指针,然而没有手动收回申请的内存。 GG 内存泄漏。

     解决方案:

       添加窗体的  WM_Destroy 消息,消息函数体:

    void CtableDemoDlg::OnDestroy()
    {
    	CDialogEx::OnDestroy();
    
    	// TODO: 在此处添加消息处理程序代码
    
    	if (mTimer != NULL)
    	{
    		delete mTimer;
    		mTimer = NULL;
    	}
    }

     这样,当窗口销毁时,销毁定时器,就可以了。


    展开全文
  • 本工程为多媒体定时器管理, 最大定时器数量可以达到1024.利用高精度的CreateWaitableTimer建立定时器,精度可以达到100ns, 使用独立线程进行管理,稳定高效,可靠. 本工程不足之处是还没有实现对定时事件部分进行同步...
  • 多媒体定时器详解

    千次阅读 2010-05-27 02:15:00
    3Windows多媒体定时器精确定时方法 Windows多媒体定时器通过调用timeSetEvent()函数,在回调函数中触发事件消息,通过消息响应函数定义一仿真帧周期系统执行的任务(定时采样、仿真模型运算、数据发送和接收等),...

    3Windows多媒体定时器精确定时方法
      
    Windows多媒体定时器通过调用timeSetEvent()函数,在回调函数中触发事件消息,通过消息响应函数定义一个仿真帧周期系统执行的任务(定时采样、仿真模型运算、数据发送和接收等),从而完成所需处理的事件。调用多媒体定时器的API函数需在头文件中添加mmsy stemh,并将库文件winmmlib添加到工程中。
    3.1设定定时器分辨率
      在使用定时器之前,应先获得定时器的设备能力,Windows提供的获取定时器分辨率的API函数为:
      MMRESULT timeGetDevCaps(lpTIMECAPS &ptc,UINT cbtc);
      参数ptc为指向TIMECAPS类型结构的指针,参数cbtc为此结构体的大小。TIMECAPS结构体中字段wPeriodMin和wPeriodMax分别为定时器设备驱动程序所支持的最小和最大分辨率值,调用timeGetDevCaps后判断程序要求的定时器最小分辨率是否处在TIMECAPS结构确定的范围内,若超出范围则系统不支持此分辨率,若处在范围内则调用API函数:
      timeBeginPeriod(UINT uPeriod);
      设定定时器分辨率,参数uPeriod为定时器分辨率值。
    3.2设定定时器事件
      Windows下设定时器事件的API函数为:
      
    MMRESULTtimeSetEvent( UINT uDelay,
          
    UINT uResolution,
          LPTIMECALLBACK lpTimeProc,
          DWORD dwUser, UINT fuEvent);
      函数返回值为定时器ID号wTimerID,函数中各参数说明如下:
      uDelay:延迟时间,用于设定事件触发间隔。
      uResolution:时间精度,在Windows中缺省值为1ms,uResolution应大于或等于传递给timeBeginPeriod的分辨率uPeriod。
      lpTimeProc:用户自定义的回调函数,定时调用,本系统中为函数TimeProc。
      dwUser:用户提供的回调数据,传递给lpTimeProc。
      fuEvent:事件触发方式,常用的有2种:TIME_ONESHOT为事件仅触发一次;TIME_PER IODIC为每隔一定时间触发一次。
    3.3声明定时器事件的回调函数

      声明全局回调函数void PASCAL TimeProc(UINT wTimerID,UINT msg,DWORD dw User, DWORD dw1, DWORD dw2)来接收多媒体定时器的事件通知。回调函数参数有5个,但只使用了其中2个参数:从timeSetEvent返回的计时器ID号wTimerID和最初作为参数传递给timeSetEvent的dwData值。系统回调函数只完成计时器事件消息的触发,利用PostMessage函数向计时器事件的窗口过程发送消息TIME_MSG,系统功能在TIME_MSG的消息响应函数OnTimeMsg中实现。
    3.4添加消息响应函数
      添加消息响应函数OnTimeMsg(WPARAM wParam,LPARAM lParam);并在函数中设置A/D采集程序、仿真计算程序以及串口通信程序。值得注意的是,任务处理的时间不能大于周期间隔时间,在回调函数中完成一些耗时的操作,如直接文件的读写、图形的复制等,易造成进程堵塞,影响定时精度。为此系统使用RS422串口最大速率(92 100 b/s)与下位机通信,同时尽可能简化仿真模型,避免高次运算,提高计算效率,在人机界面程序中不使用BitBlt等操作内存的函数,并对文件的读写使用缓冲区,以提高定时器的精度。
    3.5删除计时器和分辨率

      定时器的任务完成后,要及时删除,否则占用太多内存,系统会越来越慢。删除定时器分2步:首先调用timeKillEvent(UINT wTimerID)函数删除定时器句柄,然后用timeEndPerio d(UINT uPeriod)函数删除定时器的分辨率。

    展开全文
  • C#调用多媒体定时器

    千次阅读 2016-06-25 17:59:47
    在Windows操作系统下,为了获得高精度的定时器,大多数时候采用多媒体定时器,其分辨率可达到1ms,适用于对实时性要求比较高的场合(虽然Windows自身为非实时系统,但是在很场合还是够用的);而SetTimer提供的...
  • 多媒体定时器相比普通的定时器有更高的优先级与精度。 1,头文件中添加相关内容 #include <MMSystem.h> #pragma comment(lib,"winmm")
  • 最近实际工作中有一业务需求要求1ms精度的一定时操作,因之前这一块领域很少接触,有些文章也对多媒体定时器有描述,我结合自己的需求写了一简单demo,以备产品代码中使用。 // MultimediaTimersDemo.cpp :...
  • mfc多媒体定时器使用

    千次阅读 2019-07-03 21:56:57
    本文所用源代码在这里 1、由于需求,settimer在...2、用多媒体定时器 3、使用方法: 头文件和库: #include <MMSystem.h> #pragma comment(lib,"winmm") 2. 声明响应函数 MMRESULT Timer2; s...
  • 如何使用多媒体定时器

    千次阅读 2010-07-15 11:23:00
    如何使用多媒体定时器
  • 使用多媒体定时器创建多个线程周期性的工作,线程工作可完全由“类”描述。
  • VS2010MFC多媒体定时器

    2014-03-31 21:24:07
    多媒体找了长时间的,试了好几网上说的方案,都没有成功。最后有下载了一源代码,还是运行不了,经分析可能是vs2010的开发环境不适应吧,将消息处理函数修改后能够成功运行。 希望对你有帮助!
  • VC高精度多媒体定时器使用方法

    千次阅读 2017-10-08 15:45:48
    VC高精度多媒体定时器使用方法
  • 多媒体定时器包含以下三部分: 1 timeSetEvent() (相当于settimer) 2 timeKillEvent()(相当于killtimer) 3 回调函数(相当于系统自动添加的ontimer 在里面写上定时需要去做的事) 以下是实际使用多媒体定时器...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,808
精华内容 2,723
关键字:

多个多媒体定时器