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

    千次阅读 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文件的时钟,当然你也可以用它来做任何它能做到的事情。
  • 多媒体定时器详解

    千次阅读 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)函数删除定时器的分辨率。

    展开全文
  • 一、多媒体定时器的使用多媒体定时器不依赖消息机制,而是有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的精度。实测基本属实。

    展开全文
  • 最近实际工作中有一业务需求要求1ms精度的一定时操作,因之前这一块领域很少接触,有些文章也对多媒体定时器有描述,我结合自己的需求写了一简单demo,以备产品代码中使用。 // MultimediaTimersDemo.cpp :...

    最近实际工作中有一个业务需求要求1ms精度的一个定时操作,因之前这一块领域很少接触,有些文章也对多媒体定时器有描述,我结合自己的需求写了一个简单demo,以备产品代码中使用。

     

    // MultimediaTimersDemo.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
    //
    
    #include <iostream>
    #include <windows.h>
    
    LARGE_INTEGER _performance_count1{ 0 };
    LARGE_INTEGER _performance_count2{ 0 };
    
    //多媒体定时器回调函数,作为示例,只记录一下回调时刻的性能计数器
    void CALLBACK multimedia_timer_proc(UINT uTimerID, UINT uMsg, DWORD_PTR dwUser, DWORD_PTR dw1, DWORD_PTR dw2) {
    	::QueryPerformanceCounter(&_performance_count2);
    	timeKillEvent(uTimerID);
    }
    
    //多媒体定时器测试函数
    void multimedia_timer_test() {
    	//获取性能计数器的本机频率
    	LARGE_INTEGER _performance_frequency;
    	::QueryPerformanceFrequency(&_performance_frequency);
    	std::cout << "QueryPerformanceFrequency() result:" << _performance_frequency.QuadPart << std::endl;
    
    	//获取多媒体定时器精度范围
    	TIMECAPS tc;
        memset(&tc, 0, sizeof(tc));
    	if (timeGetDevCaps(&tc, sizeof(tc)) != TIMERR_NOERROR) {
    		std::cout << "\ntimeGetDevCaps() error:" << ::GetLastError();
    		return;
    	}
    	std::cout << "\ntimeGetDevCaps() return:\nminimum period supported:" << tc.wPeriodMin << "\nmaximum period supported:" << tc.wPeriodMax << std::endl;
    
    	//开启高精度定时
    	timeBeginPeriod(tc.wPeriodMin);
    
    	
    
    	//测试不同的时间间隔定时器
    	for (int interval = 15; interval >= 1; --interval) {
    		
    		//记录开启一个定时器之前的性能计数
    		::QueryPerformanceCounter(&_performance_count1);
    		auto timerid = timeSetEvent(interval, tc.wPeriodMin, multimedia_timer_proc, NULL, TIME_ONESHOT);
    
    		//保证定时器执行完毕
    		Sleep(1000);
    
    		std::cout << "\ntimeSetEvent(" << interval << ") return:" << timerid << std::endl;
    		std::cout << "pfc_beg=" << _performance_count1.QuadPart << "\npfc_end=" << _performance_count2.QuadPart << "\nused:" << 1000000 * (_performance_count2.QuadPart - _performance_count1.QuadPart) / _performance_frequency.QuadPart << "us" << std::endl;
    	}
    
    	std::cout << "输入任意字符结束\n";
    	getchar();
    	timeEndPeriod(tc.wPeriodMin);
    }
    
    int main()
    {
    	multimedia_timer_test();
    }
    

    在我的开发机上运行结果为:
     

    QueryPerformanceFrequency() result:10000000
    
    timeGetDevCaps() return:
    minimum period supported:1
    maximum period supported:1000000
    
    timeSetEvent(15) return:16
    pfc_beg=10216056849365
    pfc_end=10216057006210
    used:15684us
    
    timeSetEvent(14) return:32
    pfc_beg=10216066879591
    pfc_end=10216067014605
    used:13501us
    
    timeSetEvent(13) return:48
    pfc_beg=10216076899334
    pfc_end=10216077031276
    used:13194us
    
    timeSetEvent(12) return:64
    pfc_beg=10216086930899
    pfc_end=10216087055221
    used:12432us
    
    timeSetEvent(11) return:80
    pfc_beg=10216096960224
    pfc_end=10216097070690
    used:11046us
    
    timeSetEvent(10) return:96
    pfc_beg=10216106989964
    pfc_end=10216107100276
    used:11031us
    
    timeSetEvent(9) return:112
    pfc_beg=10216117027262
    pfc_end=10216117120676
    used:9341us
    
    timeSetEvent(8) return:128
    pfc_beg=10216127131879
    pfc_end=10216127212020
    used:8014us
    
    timeSetEvent(7) return:144
    pfc_beg=10216137174968
    pfc_end=10216137245500
    used:7053us
    
    timeSetEvent(6) return:160
    pfc_beg=10216147287932
    pfc_end=10216147356997
    used:6906us
    
    timeSetEvent(5) return:176
    pfc_beg=10216157373900
    pfc_end=10216157417253
    used:4335us
    
    timeSetEvent(4) return:192
    pfc_beg=10216167453586
    pfc_end=10216167495426
    used:4184us
    
    timeSetEvent(3) return:208
    pfc_beg=10216177537103
    pfc_end=10216177574443
    used:3734us
    
    timeSetEvent(2) return:224
    pfc_beg=10216187637703
    pfc_end=10216187661067
    used:2336us
    
    timeSetEvent(1) return:240
    pfc_beg=10216197774529
    pfc_end=10216197787836
    used:1330us
    输入任意字符结束
    

    可以看出精度确实可以达到1毫秒以内,每次误差在300微妙左右。

    展开全文
  • 多媒体定时器包含以下三部分: 1 timeSetEvent() (相当于settimer) 2 timeKillEvent()(相当于killtimer) 3 回调函数(相当于系统自动添加的ontimer 在里面写上定时需要去做的事) 以下是实际使用多媒体定时器...
  • 本工程为多媒体定时器管理, 最大定时器数量可以达到1024.利用高精度的CreateWaitableTimer建立定时器,精度可以达到100ns, 使用独立线程进行管理,稳定高效,可靠. 本工程不足之处是还没有实现对定时事件部分进行同步...
  • Qt之高精度多媒体定时器

    千次阅读 2018-01-30 21:51:27
    当前有许多工程实例需要非常准确的毫秒定时器,然而Qt提供的QTimer定时器优先级较低,所以其准确性不能满足需求,故本人学习widows中的多媒体定时器自定义了一高性能定时器的类,经过验证该定时器完全满足需要,...
  • VS2010MFC多媒体定时器

    2014-03-31 21:24:07
    多媒体找了长时间的,试了好几网上说的方案,都没有成功。最后有下载了一源代码,还是运行不了,经分析可能是vs2010的开发环境不适应吧,将消息处理函数修改后能够成功运行。 希望对你有帮助!
  • 可以精确到1毫秒的定时器——多媒体定时器 主要用于数据采集。VB、VC 混合编程! 1、HighResolutionTimer 2、HL_mmTimer2 两者几乎一样,精度高,但都有问题:一进程中只能用一此种控件! mmTimer_source....
  • VS+QT中使用多媒体定时器+qcustomplot绘制动态曲线VS2017+QT5.9.2中使用多媒体定时器+qcustomplot绘制动态曲线VS2017+QT5.9.2的配置QT工程的创建导入多媒体定时器和qcustomplot动态绘图总结设定内容居中、居左、居右...
  • windows多媒体定时器例程—C语言篇

    千次阅读 2016-07-18 09:19:29
    其实网上有不少关于多媒体定时器应用的文章和例子,只不过这些程序一方面都是用C++编的,另一方面没有一能完全正确运行的。没办法,只好自己编。经过一番周折,总算得一能正常运行的例子。下面就是这例子的C...
  • 利用多媒体定时器可以很精确地读出系统的当前时间,并且能在非常精确的时间间隔内完成一事件、函数或过程的调用。利用多媒体定时器的基本功能,可以通过两种方法实现精确定时。1)使用timeGetTime()函数,该函数...
  • 可恶的多媒体定时器

    千次阅读 2007-03-19 14:57:00
    现在要做的一实时数据采集任务,需要用到多媒体定时器,根据某些资料,我在对话框中试用了一下,没有成功。我是这样做的:在对话框中的某个按钮的消息响应函数中启动定时器,每隔一定时间在对话框中的编辑框中输出...
  • 说道定时器,很多人都会想到Windows定时器SetTimer吧!... 这时我就考虑,是否能给定时器创建一单独的线程,接着就发现了“多媒体定时器”这东西。它是一高精确度定时器,一般的Windows定时器只能精确...
  • 在没有硬件中断源的情况下,多媒体定时器还真是一不错的选择,我找到了一C#下可以用的多媒体定时器的库(下载地址在文末),进行了1ms周期的测试,并用c#的timer控件进行了对比测试,差别非常大(详见对比数据)...
  • 主要完成两件事:声明一个线程,声明一个多媒体定时器。我想你也猜到要怎么做了,对,在声明的线程里面声明多媒体定时器,然后执行。道理是不是很简单,理解这句话你就掌握80%了,程序编写更简单。 整个程序程序...
  • 如题
  • 最近在工程中需要使用多媒体定时器,故总结了一下两需要注意的地方: 1,主函数使用WinMain函数 2,添加mmsystem和windows头文件 下面两函数,StarTimer和EndTimer,供大家参考,如有错误,欢迎批评指
  • 如果需要精度更高一些的定时器(精确到1ms),可以使用下面的高精度多媒体定时器进行代码优化,可以达到毫秒级的精度,而且使用方便。先要包含头文件"mmsystem.h"和库文件"winmm.lib"。 vc高精度多媒体定时器的...
  • 第三参数直接接受回调函数报错形参不兼容 强制转换报类型转换无效 回调函数如下,还没加入内容: void CALLBACK CCImageDlg::SendFun(UINT wTimerID, UINT msg, DWORD dwUser, DWORD dwl, DWORD dw2) 菜鸟求解
  • Windows下的多媒体定时器:timeSetEvent

    千次阅读 2015-05-05 09:50:50
    Windows下的多媒体定时器 头文件:#include timeSetEvent(15000, 1, (LPTIMECALLBACK)onTimeFunc, (DWORD)this, TIME_PERIODIC); 第一参数是毫秒数,第二参数是延迟时间,越小越精确,最小为1,第三是回...
  • 前言 本博客在MFC工程中,完成了对创建多媒体定时器和读文档...创建多媒体定时器由四函数合作完成: 执行创建:CreateTimer(); 执行回调:TimeProc(); 执行内容:OnTimer(); 执行销毁:DestroyTimer(); ...
  • 如果需要精度更高一些的定时器(精确到1ms),可以使用下面的高精度多媒体定时器进行代码优化,可以达到毫秒级的精度,而且使用方便。先要包含头文件"mmsystem.h"和库文件"winmm.lib"。 vc高精度多媒体定时器的...
  • VC++或QT下 高精度 多媒体定时器

    千次阅读 2013-10-23 16:23:03
    如果需要精度更高一些的定时器(精 确到1ms),可以使用下面的高精度多媒体定时器进行代码优化,可以达到毫秒级的精度,而且使用方便。先要包含头文件"mmsystem.h"和库文 件"winmm.lib"。  虽然Win95下可视化...

空空如也

空空如也

1 2 3 4 5 ... 11
收藏数 214
精华内容 85
关键字:

多个多媒体定时器