• 关于VC中的时间函数讨论


    关于在VC中时间函数的事业问题在论坛有不少的帖子讨论,下面结合讨论结果和相关的知识做个总结。

    先从一个如何在程序中延时的问题谈起,延时的方法有
    方法一:
    使用sleep函数,它的最小单位是1ms,如延时2秒,用sleep(2000)。
    方法二:
    使用sleep函数的不利处在于期间不能处理其他的消息,如果时间太长,就好象死机一样,所以我们利用

    COleDateTime类和COleDateTimeSpan类结合WINDOWS的消息处理过程来实现延时:
    COleDateTime  start_time = COleDateTime::GetCurrentTime();
    COleDateTimeSpan  end_time = COleDateTime::GetCurrentTime()-start_time;
    While(end_time.GetTotalSeconds() <= 2) //实现延时2秒

       MSG? msg;  
       GetMessage(&msg,NULL,0,0);  
       TranslateMessage(&msg);
      DispatchMessage(&msg);  
       End_time  = ColeDateTime::GetCurrentTime-start_time;  
    }//这样在延时的时候我们也能够处理其他的消息。
    方法三:
     可以采用GetTickCount()函数,该函数的返回值是DWORD型,表示以毫秒为单位的计算机启动后经历的时间间隔。
    DWORD dwStart = GetTickCount();
    DWORD dwEnd = dwStart;
    do
    {
      MSG? msg;? 
       GetMessage(&msg,NULL,0,0);? 
       TranslateMessage(&msg); 
       DispatchMessage(&msg); 
       dwEnd = GetTickCount();?
    } while((dwEnd - dwStart)? <=? 2000);
    上面的方法在延时的精确度上,很多时候不能满足我们的要求,下面是一种更精确的微秒级延时:
    LARGE_INTEGER  litmp ;
    LONGLONG  QPart1,QPart2 ;
    double d=0;
    QueryPerformanceCounter(&litmp) ;
    // 获得初始值
    QPart1 = litmp.QuadPart ;
    while (d<40)//你想要的时间
    {
      QueryPerformanceCounter(&litmp) ; 
       QPart2 = litmp.QuadPart ;
       d=(double)(QPart2 - QPart1);
    }

    再看看仅供WIN9X使用的高精度定时器:QueryPerformanceFrequency()和QueryPerformanceCounter(),要求计算机从硬件上支持高精度定时器。函数的原形是:
    BOOL QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency);
    BOOL QueryPerformanceCounter (LARGE_INTEGER *lpCount);
    数据类型LARGEINTEGER既可以是一个作为8字节长的整数,也可以是作为两个4字节长的整数的联合结构,其具体用法根据编译器是否支持64位而定。该类型的定义如下:
    typeef union _ LARGE_INTEGER
    {
      struct
       {
         DWORD LowPart;
         LONG? HighPart;
        };
        LONGLONG QuadPart;
    } LARGE_INTEGER;
    在定时前应该先调用QueryPerformanceFrequency()函数获得机器内部计时器的时钟频率。接着在需要严格计时的事件发生前和发生之后分别调用QueryPerformanceCounter(),利用两次获得的计数之差和时钟频率,就可以计算出事件经历的精确时间。测试函数SLEEP(100)的精确持续时间方法:
    LARGE_INTEGER litmp;
    LONGLONG qt1,qt2;
    double dft,dff,dfm;
    QueryPerformanceFrequency(&litmp);//获得时钟频率
    dff=(double)litmp.QuadPart;
    QueryPerformanceCounter(&litmp);//获得初始值
    qt1=litmp.QuadPart;Sleep(100);
    QueryPerformanceCounter(&litmp);//获得终止值
    qt2=litmp.QuadPart;
    dfm=(double)(qt2-qt1);
    dft=dfm/dff;//获得对应的时间值
    需要注意的是DFT计算的结果单位是秒。
    参考连接:
    http://dev.csdn.net/develop/article/31/31188.shtm
    http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=195559

  • 相关阅读:
    java基础之条件运算符
    java基础之x++与++x
    java基础之三种注释及API帮助文档的生成
    java基础之类型转换及常量的应用
    java基础之数据类型
    java基础之标识符
    生活小插曲(长篇连载,持续更新ing)^_^
    记录那个刚毕业,还不太富裕的那个人的生活
    记录两次小组会议总结
    这是大娃笔记里的一首散文诗
  • 原文地址:https://www.cnblogs.com/hehe520/p/6330161.html
Copyright © 2020-2023  润新知