我在做一段测试,目的是为了统计一段代码执行所用的时间,我设置了一个定时器,同时设置了一个bool b,在定时器里面设置的代码如下: if(b)
         {
count++;//初始化count =0,定时器设置是SetTimer(1,1,NULL)放在OnIndialog里面的,
         }
     在测试代码执行之前我把b= true;   这个时候就应该开始计时了,然后在等我要测试的代码执行完了我再显示这个count的值,代码如下:
                   b=true;
proc->execute();//要统计执行时间的一段代码
CString str;
str.Format("%S",count);
MessageBox(str);
但是我这边显示的str的值是NULL,调试执行count的值是0,刚开始的时候定时器里面的代码执行了,但是在执行proc->execute();这个代码的阶段怎么也不跳到定时器里面去执行,这个是什么原因,难道是引文我的proc->execute();这段代码执行的时间不到千分之一秒??到底是什么原因啊????????????????????????????

解决方案 »

  1.   

    当然不能用计时器了,在代码前后用GetTick
      

  2.   

    SetTimer参数设为1,并不代表为1毫秒,首先它的精确度不能达到这么高,大概在50毫秒的级别,其通过消息循环来实现,用来计时并不准确。另外,设为1,表示的是:If uElapse is greater than USER_TIMER_MAXIMUM, the timeout is set to 1.(MSDN)可以简单的使用GetTickCount或GetTickCount64
    DWORD b = GetTickCount();
    你的代码
    DWORD a = GetTickCount();
    DWORD timeElapse = a - b;
      

  3.   

    先不论用定时器的方法好不好!
    就本身问题而论,LZ的计时器应该还没有开始计时,也就是楼主在b=true时,定时器并没有运作.
    实例可能如下:
    1:Dia中设定了计时器,并B=false;
    2:按下Dia中的某一BUTTON时,b=true;::Sleep(1000);显示count的值;b=false;
    此时count当然为0,因为按下BUTTON时,消息循环中处于处于按下BUTTON的消息中,没有进行到处理定时器发送的消息中。
    如果,按下BUTTON中不设定b=false;那么,等会再按下BUTTON,才会看到显示count的值更改,这个空闲时间才会处理定时器消息
      

  4.   

    GetTickCount()函数不能计数1ms以下的计时。如需精确计时,可使用函数:QueryPerformanceFrequency和QueryPerformanceCounter
    这其中要用到数据类型LARGE_INTEGER
    数据类型LARGE_INTEGER既可以是一个8字节长的整型数,也可以是两个4字节长的整型数的联合结构, 其具体用法根据编译器是否支持64位而定。该类型的定义如下:
    typedef union _LARGE_INTEGER
    {
    struct
    {
    DWORD LowPart ;// 4字节整型数
    LONG HighPart;// 4字节整型数
    };
    LONGLONG QuadPart ;// 8字节整型数
    }LARGE_INTEGER ;例子:
    LARGE_INTEGER liStart,liEnd,liFreq;
    double dfMinus, dfFreq, dfTim; 
    LONGLONG QPart1,QPart2;
    QueryPerformanceFrequency(&liFreq);
    dfFreq = (double)liFreq.QuadPart;
    QueryPerformanceCounter(&liStart);//do somethingQueryPerformanceCounter(&liEnd);
    QPart2 = liEnd.QuadPart;
    QPart1 = liStart.QuadPart;
    dfMinus = (double)(QPart2-QPart1);
    dfTim = dfMinus / dfFreq;
    m_strTimeTip.Format(_T("本次处理耗时:%fms"),dfTim);