小可最近要用到循环性的延时。。
找到了些相关文章,
其中,尤以“最熟悉的陌生人”兄台中的一段文字,坡有启发:使用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>也不能解决。另外,还有一个重要的问题,就是我查找资料,好像这个函数只能输出精确到秒的级别,不知如何能精确到毫秒级,同时耶能对界面的操作比较快的进行相应呢?请各位大侠指点一下。谢谢。
找到了些相关文章,
其中,尤以“最熟悉的陌生人”兄台中的一段文字,坡有启发:使用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>也不能解决。另外,还有一个重要的问题,就是我查找资料,好像这个函数只能输出精确到秒的级别,不知如何能精确到毫秒级,同时耶能对界面的操作比较快的进行相应呢?请各位大侠指点一下。谢谢。
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;
}
应该是COleDateTime
http://community.csdn.net/Expert/topic/2663/2663023.xml?temp=.585705
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);
}
QueryPerformanceCounter获得系统启动以来,CPU Clock的次数。
没有比这更精确的了。
不过,windows并不是实时操作系统,所以实际上没有任何毫秒级准确调用的保证。
DWORD dwStart = GetTickCount();
DWORD dwEnd = GetTickCount();
while((dwEnd - dwStart) <= 2000)
{
MSG msg;
GetMessage(&msg,NULL,0,0);
TranslateMessage(&msg);
PreDispatchMessage(&msg);
dwEnd = GetTickCount();
}
MSG msg;
GetMessage(&msg,NULL,0,0);
TranslateMessage(&msg);
PreDispatchMessage(&msg);
这一段处理足够了