1. ホーム
  2. シーピー

C#高精度遅延コード実行時間(us/ns)

2022-02-08 16:38:10

SleepやThreadなど、よく使われる遅延コード関数を紹介します。

しかし、それらが許容するのは 入力 ミリ秒のような精度が必要な場合は

ナノ秒(ns)/マイクロ秒(us)のコード実行の遅れ どうやるの?


上の画像では、次のようなaddressパラメータがあることがわかります。

long duetime = -10 * us;

元のパラメータ型は LARGE_INTEGER

を使用して定義されています。 長い の代わりに ダブル

遅延させる時間を示す 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;







        [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;