小可最近要用到循环性的延时。。
找到了些相关文章,
其中,尤以“最熟悉的陌生人”兄台中的一段文字,坡有启发:使用sleep函数的不利只处在于期间不能处理其他的消息,如果时间太长,就好象死机一样,利用ColeDateTime类和ColeDateTimeSpan类实现延时:
ColeDateTime start_time = ColeDateTime::GetCurrentTime();
ColeDateTimeSpan end_time = ColeDateTime::GetCurrentTime()-start_time;
While(end_time.GetTotalSeconds() <= 2)
{
  MSG msg;
  GetMessage(&msg,NULL,0,0);
  PreTranslateMessage(&msg);
  End_time = ColeDateTime::GetCurrentTime-start_time;
}之所以选这种方式,是因为首先sleep(n)在延时过程中,对界面操作的反应很慢。然后,不想用SetTime(),因为我已经用了一个了。不想再弄一个了。但是尝试之下,发现了问题就是,出现了error,提示,就是ColeDateTime类未定义等,即使是在包括了相应的头函数#include<afxdisp.h>也不能解决。另外,还有一个重要的问题,就是我查找资料,好像这个函数只能输出精确到秒的级别,不知如何能精确到毫秒级,同时耶能对界面的操作比较快的进行相应呢?请各位大侠指点一下。谢谢。

解决方案 »

  1.   

    这个程序段要改的COleDateTime  start_time = COleDateTime::GetCurrentTime();  
    COleDateTimeSpan  end_time = COleDateTime::GetCurrentTime() - start_time;  
    while(end_time.GetTotalSeconds()  <=  2)  
    {  
    MSG  msg;  
    GetMessage(&msg,NULL,0,0);  
    TranslateMessage(&msg); 
    PreDispatchMessage(&msg); 
    end_time = COleDateTime::GetCurrentTime() - start_time;  
    }
      

  2.   

    sorry 呵呵!第二个字母要大写.
    应该是COleDateTime
      

  3.   

    如果需要更精确的,看看下面的帖子.
    http://community.csdn.net/Expert/topic/2663/2663023.xml?temp=.585705
      

  4.   

    可精确到微秒
    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);
    }
      

  5.   

    QueryPerformanceFrequency获得CPU频率
    QueryPerformanceCounter获得系统启动以来,CPU Clock的次数。
    没有比这更精确的了。
    不过,windows并不是实时操作系统,所以实际上没有任何毫秒级准确调用的保证。
      

  6.   

    直接用GetTickCount()就可以精确到毫秒级。
    DWORD dwStart = GetTickCount();
    DWORD dwEnd = GetTickCount();
    while((dwEnd - dwStart)  <=  2000)  
    {  
    MSG  msg;  
    GetMessage(&msg,NULL,0,0);  
    TranslateMessage(&msg); 
    PreDispatchMessage(&msg); 
    dwEnd = GetTickCount();  
    }
      

  7.   

    也不一定用线程
    MSG  msg;  
    GetMessage(&msg,NULL,0,0);  
    TranslateMessage(&msg); 
    PreDispatchMessage(&msg); 
    这一段处理足够了