各位大虾,小弟正在编一个控制软件,须精确计时,<=0.1ms,而且希望几乎不受多进程影响,请问该如何实现。已用PerformanceCounter,效果不好,有其他办法吗?

解决方案 »

  1.   

    timeGetTime(),用多媒体时钟, 在 mmsystem.h里
      

  2.   

    多媒体定时器似乎是精确到ms级别的,0.1ms很难达到
    在windows下面多进程的话几乎没法做到绝对精确
    实在不行就上硬件来控制,自己做块板子插在主板上,呵呵
      

  3.   

    多媒体时钟似乎精度不够,我用的硬件其实是自带时钟的,可以定时向windows发中断,但用户级的应用程序是看不到中断的,不知道如何才能利用这个时钟
      

  4.   

    ?用DRIVER级的内核时钟
    大哥,能否说得更清楚一些,究竟如何使用?谢了
      

  5.   

    在要求误差不大于1毫秒的情况下,可以采用GetTickCount()函数(如果读者仍然使用Windows3.1,可以使用GetCurrentTime()函数),该函数的返回值是DWORD型,表示以毫秒为单位的计算机启动后经历的时间间隔。使用下面的编程语句,可以实现50毫秒的精确定时,其误差小于1毫秒。
    DWORD  dwStart, dwStop ;  // 起始值和中止值
    dwStop = GetTickCount();
    while(TRUE)
    {
      dwStart = dwStop ;  // 上一次的中止值变成新的起始值
        // …… 此处添加相应控制语句 ……
        do
        {
    dwStop = GetTickCount() ;
        } while(dwStop - 50 < dwStart) ;
    }
      

  6.   

    QueryPerformanceFrequency()函数和QueryPerformanceCounter()函数。这两个函数是Visual C++提供的仅供Windows 95及其后续版本使用的高精度时间函数,并要求计算机从硬件上支持高精度计时器。QueryPerformanceFrequency()函数和QueryPerformanceCounter()函数的原型为:       BOOL  QueryPerformanceFrequency
    (LARGE_INTEGER  *lpFrequency) ;
          BOOL  QueryPerformanceCounter
    (LARGE_INTEGER  *lpCount) ;
      

  7.   

    QueryPerformanceFrequency()函数和QueryPerformanceCounter()函数。这两个函数是Visual C++提供的仅供Windows 95及其后续版本使用的高精度时间函数,并要求计算机从硬件上支持高精度计时器。QueryPerformanceFrequency()函数和QueryPerformanceCounter()函数的原型为:       BOOL  QueryPerformanceFrequency
    (LARGE_INTEGER  *lpFrequency) ;
          BOOL  QueryPerformanceCounter
    (LARGE_INTEGER  *lpCount) ;
      

  8.   

    GetTickCount只是说“误差”小于一1ms啊。我试了一下,做个循环调用GetTickCount,结果返回时两个值之间的差要么为0,要为以10ms为步进。可能是机器速度的问题?不会的吧,要不怎么会有t2-t1=0的情况,再者我的机子是1.1GHz的,应该不是机器速度问题,对吧。我现在找精确计时的办法,听说有timeSetEvent()之类的函数,还没试过能不能这么精确。
      

  9.   

    http://www2.ccw.com.cn/tips/2k02/022902_03.asp
      

  10.   

    感谢大家的热心回复,事实上我已经用PerformanceCounter实现了,但如第一篇所说,效果不好,表现为程序切换时采集数据可能出现白线,也有可能不是PerformanceCounter导致的,其他方法好像都不能使精度<=0.1ms。
    总之谢谢大家!