用Sleep函数延时,如何时间太长,程序就像无响应一样,采用消息泵可以解决这个问题
5秒延时
COleDateTime odtStart = COleDateTime::GetCurrentTime();
COleDateTimeSpan odtsEnd = COleDateTime::GetCurrentTime()-odtStart;
while(5>=odtsEnd.GetTotalSeconds())
{
MSG msg;
GetMessage(&msg,NULL,0,0);
TranslateMessage(&msg);
DispatchMessage(&msg);
odtsEnd = COleDateTime::GetCurrentTime()-odtStart;
}
AfxMessageBox(L"5秒之后");
50毫秒延时
这其中也有一些误差
DWORD dwStart = GetTickCount();
DWORD dwEnd = 0;
do
{
MSG msg;
GetMessage(&msg,NULL,0,0);
TranslateMessage(&msg);
DispatchMessage(&msg);
dwEnd = GetTickCount();
} while((dwEnd - dwStart) <= 50);
AfxMessageBox(L"50豪秒之后");
5微秒延时
对于更精确的延时就要用QueryPerformanceCounter函数
LARGE_INTEGER liTemp ;
LONGLONG nStart=0,nEnd=0 ;
double nTemp=0;
QueryPerformanceCounter(&liTemp) ;
nStart = liTemp.QuadPart ;
while (nTemp<5)
{
QueryPerformanceCounter(&liTemp) ;
nEnd = liTemp.QuadPart ;
nTemp=static_cast<double>(nEnd - nStart);
}
AfxMessageBox(L"5微秒之后");
以上程序在VC++2005 UNICODE下调试通过