设计一个简单的程序,有两个button,分别点击button1和button2,计算两次点击的时间差,要求精确到微秒,所以使用QueryPerformanceCounter和QueryPerformanceFrequency这两个函数。程序代码如下:
void CMy0509Dlg::OnButton1() 
{

QueryPerformanceFrequency(&frequency);
QueryPerformanceCounter(&start);
}void CMy0509Dlg::OnButton2() 
{

LARGE_INTEGER TMP;
QueryPerformanceCounter(&stop);
TMP.QuadPart=(stop.QuadPart-start.QuadPart);
m_start=(double)start.QuadPart;
m_stop=(double)stop.QuadPart;
m_frequency=(double)frequency.QuadPart;
m_interval=(double)(TMP.QuadPart/frequency.QuadPart);
UpdateData(false);
}在界面上显示两次的时间和频率,还有时间差。可是测试结果根本不对,是一个无规律的数。在网上看了很多使用这个函数的例子,和我的这个好像也没有什么差别。请高手帮忙看看是哪里出了问题。
测试的一次结果如下:
start:201799951176606
stop:201847198158895
interval:46663
frequency:1012500
frequency倒是 很准,,每次都是这个数。

解决方案 »

  1.   

    怎么没规律,stop比start大,interval是正数,说明都是对的。
      

  2.   

    stop比start大的太多,得到的interval应该是秒为单位的。我是连续按的这两个按钮,可是得到的是这个非常大的数。而且每次还相差很多。这是什么原因呢?
      

  3.   

    没错,不是随机数
    QueryPerformanceCounter()这个函数返回高精确度性能计数器的值,它可以以微妙为单位计时.但是QueryPerformanceCounter()确切的精确计时的最小单位是与系统有关的,所以,必须要查询系统以得到QueryPerformanceCounter()返回的嘀哒声的频率.QueryPerformanceFrequency()提供了这个频率值,返回每秒嘀哒声的个数.计算确切的时间是从第一次调用QueryPerformanceCounter()开始的假设得到的LARGE_INTEGER   为nStartCounter,过一段时间后再次调用该函数结束的,设得到nStopCounter.两者之差除以QueryPerformanceFrequency()的频率就是开始到结束之间的秒数.由于计时函数本身要耗费很少的时间,要减去一个很少的时间开销.但一般都把这个开销忽略.公式如下:   
                       nStopCounter-nStartCounter   
        ElapsedTime=------------------------------------     -   overhead   
                            frequency