C# 高精度延遲代碼執行時間(us/ns)

ny8p 9年前發布 | 2K 次閱讀 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);  
}  </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 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!