C# 高精度延遲代碼執行時間(us/ns)
我們常用的延遲代碼函數如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); } </pre>
[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; </pre> 來自:http://blog.csdn.net/u012395622/article/details/46470607
本文由用戶 ny8p 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!