要做一个定时器,要求精确到毫秒,要怎么做?用SetTimer()行吗?
如果哪位有例子那更好了。

解决方案 »

  1.   

    可以啊楼主可以去msdn上查一下,呵呵给你一段msdn上的实例程序Examplevoid CMyDlg::OnStartTimer() 
    {
       m_nTimer = SetTimer(1, 2000, 0);
    }void CMyDlg::OnStopTimer() 
    {
       KillTimer(m_nTimer);   
    }void CMyDlg::OnTimer(UINT nIDEvent) 
    {
       MessageBeep(0xFFFFFFFF);   // Beep   // Call base class handler.
       CDialog::OnTimer(nIDEvent);
    }那个2000就是事件,毫秒,你可以现在就是2000毫秒你可以用class wizard找到响应wm_timer的OnTimer函数
      

  2.   

    SetTimer的精确度大约在50ms之内可以参考这里http://www.vckbase.com/document/viewdoc/?id=1301
      

  3.   

    2 多媒体定时器和硬件接口函数 ---- Visual C ++ 提供了两种定时器。一般常用的是系统计时器,它使用函数SetTimer进行初始化,应用程序响应SetTimer函数发送来的消息WM_TIMER。这个定时器是IBM PC硬件和ROM BIOS构造的定时器逻辑的一个相当简单的扩展。PC的ROM初始化Intel8259定时器芯片来产生硬件中断08H。这个中断有时称为"定时器滴答"中断。中断08H每隔54。925毫秒产生一次,或大约每秒18.2次。BIOS使用中断08H更新存于BIOS数据区的"时间"值。因此,这个定时器在Windows中的最大缺点是计时器的最大分辨率是55毫秒,也就是说应用程序每秒只能接收到18个消息。此外,这个计时器消息的优先权太低,只有在所有的消息(除了消息WM_PAINT)被处理后才能被处理。因此函数SetTimer只能用于一般的定时,如扉屏显示时间定时等,它远远不能满足实时数据采集的要求。本文重点介绍的是多媒体定时器(Multimedia Timer)。它使用自己单独的线程(Thread),来调用一个自己的回调函数(Callback Function)。它的优先级很高,它每隔一定时间就发送一个消息而不管其它消息是否执行完。此外,对于现在的Intel CPU来说,它的最小定时精度通常都可以达到1毫秒,足够满足实时数据采集的定时精度。第4节将详细阐明Visual C++ 5.0 中多媒体定时器使用的详细过程。 ---- Visual C++ 5.0 作为C++的可视化编程工具,具有C语言对硬件操作的能力。它提供了大量的操作台函数(可参阅Visual C++提供的帮助)。例如:从端口地址读取数据的函数_inp(读字节), _inpw(读字), _inpd(读双字)和向端口写操作字和赋初值的函数_outp(写字节), _outpw(写字), _outpd(写双字)。_inp, _inpw, _inpd三个函数的参数均为地址变量,返回的是该地址口读取的数据。_outp, _outpw, _outpd三个函数的第一个参数是地址,第二个参数是须写入地址的数据。 ---- 读端口地址的三个函数原型分别是:  int _inp( unsigned short port );
     unsigned short _inpw( unsigned short port );
     unsigned long _inpd( unsigned short port );
    向端口地址写数据或命令字的三个函数原型分别如下:
     int _outp( unsigned short port, int databyte );
     unsigned short _outpw( unsigned short port,
     unsigned short dataword );
     unsigned long _outpd( unsigned short port,
     unsigned long dataword );---- 举例来说,对端口地址0xAddress写入字节数据0xData是_outp(0xAddress,0xData),而若从该地址读取字节数据,则用_inp(0xAddress)。第5节将以一实例介绍硬件操作的全过程。 
    3 Visual C++多媒体定时器的编程实现 ---- 3.1设定Windows 95多媒体定时器[1][2] ---- 多媒体定时器可直接用Component Gallery在项目中插入Windows Multimedia组件,此时多媒体定时器所需的头文件和库将自动插入工程的Stdafx.h中,或用手直接将以下语句添入Stdafx.h,即: #include <MMSystem.h>
     // CG: The following line was added
     by the Windows Multimedia component.
     #pragma comment(lib, "winmm.lib")---- 3.2 多媒体定时器的应用 1)定义定时器参数 
     #define TEN_MILLI_SECOND 200 //定时器间隔
    #define TIMER_ACCURACY 1//定时器精度
     UINTTimer_ID;//定时器句柄
     UINTwAccuracy; //定时器精度参数
    2)通过多媒体定时器设备函数
    timeGetDeviceCaps获得本微机的最大分辨率。
     TIMECAPS tc; //定时器分辨率的结构
     If(timeGetDeviceCaps(&tc,sizeof(TIMECAPS))
     = = TIMERR_NOERROR)
     {
    //获得本系统的最小定时器分辨率,
    所有应用必须大于等于该分辨率
     wAccuracy=min(max(tc.wPeriodMin,
     TIMER_ACCURACY),tc.wPeriodMax);
     //设定本应用的所需的定时器分辨率,
     本例为微机的所允许的最大分辨率
     timeBeginPeriod(wAccuracy);
     }
    3)应用多媒体定时器的timeSetEvent函
    数设定事件的触发方式,它的函数原形是:
     MMRESULT timeSetEvent( UINT uDelay,
     UINT uResolution,
    LPTIMECALLBACK lpTimeProc, 
    DWORD dwUser, UINT fuEvent); 
     uDelay用于设定事件触发间隔;
     uResolution用于设定程序所需的最小分辨率;
     lpTimeProc 调用回调函数;
     dwUser 用户提供的回调数据;
     fuEvent 事件触发方式,
     在Visual C++中有两种方式:
     TIME_ONESHOT:事件仅触发一次 
     TIME_PERIODIC:每隔一定时间触发一次 
    TimeSetEvent函数返回定时器句柄,
    具体应用是:
    Timer_ID=timeSetEvent
    (TEN_MILLI_SECOND,wAccuracy,
    ( LPTIMECALLBACK)CatchMMTimer,
    (DWORD)hWnd,TIME_PERIODIC);
    4)声明一个全局的回调(Callback)函数
    void CALLBACK TwoHundredMilliSecondProc
    (UINT wTimerID,UINT nMsg,DWORD
    dwUser,DWORD dw1,DWORD dw2),---- 在回调函数中调用事件触发消息且在回调函数中语句尽量简单,不要在回调函数内做一些耗时的操作; 
    ---- 5)添加用户消息CatchMMTimer函数,用来接收多媒体定时器的事件通知。其过程是首先在类的头文件定义:#define MYMSG_TIMER WM_USER+101,然后在类头文件的AFX_MSG块中说明消息处理函数:afx_msg LRESULT OnMymsgTimer(WPARAM wParam, LPARAM lParam); 在类实现的消息映射块中,使用ON_MESSAGE宏指令将消息映射到消息处理函数中:ON_MESSAGE (MYMSG_TIMER, OnMymsgTimer)。最后在相应类中实现消息处理函数。关于用户自定义消息具体可参考Visual C++ s书籍。如:PostMessage((HWND)dwUser,MYMSG_TIMER,0,0); //PostMessage发送消息 ---- 6)定时器的任务完成后,要及时删除,否则占用太多内存,系统会越来越慢。删除定时器分两步,首先调用timeKillEvent函数删除定时器句柄,然后用timeEndPeriod函数删除定时器的分辨率。具体应用如下: ---- timeKillEvent(Timer_ID); 
    ---- timeEndPeriod(wAccuracy); ---- 本节所用所有函数的使用可参阅Visual C++提供的在线帮助。 
      

  4.   

    那么主要是调用timeSetEvents函数,你可以提供一个Callback函数,这个Callback函数相当于中断处理函数。在Windows API说明中,你可以找到一系列time函数。具体的例子可以参考:http://www.codeguru.com/multimedia/mmTimers.shtml
      

  5.   

    http://sfengdai.blogchina.com/1165471.html
    多媒体定时器 的 应 用