首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC 教學

VC++函數中實現多種精度延時操作的方法總結

     編輯:VC 教學

秒級延時:COleDateTime


COleDateTime start = COleDateTime::GetCurrentTime();
COleDateTimeSpan span;
do {
    MSG msg;
    if (GetMessage(&msg, NULL, 0, 0)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    span = COleDateTime::GetCurrentTime() - start;
} while (span.GetTotalSeconds() <= 2);

可用 GetTotalMinutes、GetTotalHours、GetTotalDays 擴展至更長區間。

毫秒級延時:GetTickCount


DWORD dwStart = GetTickCount(), dwEnd = dwStart;
do {
    MSG msg;
    if (GetMessage(&msg, NULL, 0, 0)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    dwEnd = GetTickCount();
} while (dwEnd - dwStart <= 2000); // 2000 毫秒

微秒級延時:QueryPerformanceCounter


LARGE_INTEGER li;
LONGLONG q1, q2;
double d = 0;
QueryPerformanceCounter(&li);
q1 = li.QuadPart;
while (d < 40) { // 40 微秒示例
    QueryPerformanceCounter(&li);
    q2 = li.QuadPart;
    d = (double)(q2 - q1); // 需結合 QueryPerformanceFrequency 換算實際時間
}

注意:實際微秒換算需除以 QueryPerformanceFrequency 返回的頻率。

時鐘週期級延時:內聯彙編 NOP 迴圈


#define NOP_COUNT 3
__asm {
    MOV ECX, NOP_COUNT
DELAY:
    NOP
    LOOP DELAY
}

需根據 CPU 指令週期手動計算 NOP_COUNT,精度最高但可移植性最差,通常不建議在應用層使用。

選擇建議

  • 秒級以上、需處理消息迴圈:COleDateTime。
  • 毫秒級、需保持界面響應:GetTickCount。
  • 高精度計時測量:QueryPerformanceCounter。
  • 極短硬件相關延時:內聯彙編(慎用)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved