標籤:延遲 c# 納秒 微秒 高精度
我們常用的延遲代碼函數如Sleep,Thread.Sleep函數,
但是它們只允許輸入毫秒,如果我們需求更高精度 如
納秒(ns)/微秒(us)的延遲代碼執行的時間 怎麼去做呢?
在我們可以看見有這樣一個傳址參數
long duetime = -10 * us;
原參數類型為 LARGE_INTEGER
定義是用long而不是double
表示需要延遲的時間 它是以100納秒為一單位
你給1表示100納秒 是該函數可接最低刻度
CreateWaitableTimer // 建立可等待計時器
SetWaitableTimer // 啟動可等待計時器
MsgWaitForMultipleObjects // 等待核心對象或訊息
CloseHandle // 關閉核心對象
範例程式碼:
public static void Main() { UsDelay(5); // 5us } public static void UsDelay(int us) { long duetime = -10 * us; int hWaitTimer = CreateWaitableTimer(NULL, true, NULL); SetWaitableTimer(hWaitTimer, ref duetime, 0, NULL, NULL, false); while (MsgWaitForMultipleObjects(1, ref hWaitTimer, false, Timeout.Infinite, QS_TIMER)); CloseHandle(hWaitTimer); }
[DllImport("kernel32.dll")] public static extern int CreateWaitableTimer(int lpTimerAttributes, bool bManualReset, int lpTimerName); [DllImport("kernel32.dll")] public static extern bool SetWaitableTimer(int hTimer, ref long pDueTime, int lPeriod, int pfnCompletionRoutine, // TimerCompleteDelegate int lpArgToCompletionRoutine, bool fResume); [DllImport("user32.dll")] public static extern bool MsgWaitForMultipleObjects(uint nCount, ref int pHandles, bool bWaitAll, int dwMilliseconds, uint dwWakeMask); [DllImport("kernel32.dll")] public static extern bool CloseHandle(int hObject); public const int NULL = 0; public const int QS_TIMER = 0x10;
C# 高精度延遲代碼執行時間(us/ns)