我在這裡把論壇裡能見到的幾種延時方式總結一下。
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);
DispatchMessage(&msg);
end_time = COleDateTime::GetCurrentTime() - start_time; }
還有一點說明,因為COleDateTimeSpan類的成員函數還有:GetTotalMinutes、GetTotalHours、GetTotalDays,能夠實現更大時間段的延時。
往更小的時間跨度上說,執行毫秒級的延時用GetTickCount就行: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);}。
最後,如果還不能滿足,那就去做時鐘周期的延時吧:
#define NOP_COUNT 3//需要自己根據NOP及LOOP的指令周期計算.__asm { MOV ECX, NOP_COUNTDELAY: NOP LOOP DELAY }不過,用VC做這個工作是不是有點……