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;
関連
-
C# string.format でのエラー: 入力文字列が正しい形式でない
-
c# - デシリアライズ・エラー。入力文字列が正しい形式でない
-
C#とC++の型対応表まとめ
-
Unityがエラーを報告します。コレクションが変更されました。列挙操作が実行されない可能性があります。
-
インデックスが配列の範囲外であった。
-
C#のビルドコードで、すべてのコードパスが値を返さないエラーが発生する
-
System.InvalidOperationException: ConnectionString プロパティが初期化されていません。
-
C# データベース操作エラー。この接続に関連付けられた開いているDataReaderがすでにあり、これを閉じる必要があります...
-
C#の構文]をご覧ください。C#のリフレクション(アセンブリ)機構を説明する
-
AppDomainとAssemblyの動的なロードとアンロード
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
C# indexof() の使用法
-
C#の遅延関数の使用
-
C#の面接質問100選(.net開発者必見)
-
C#でUSBデバイスを操作する方法
-
VS エラー LNK2005:**already defined in **.obj
-
HTTP エラー 500.22 - 内部サーバー エラー-IIS7 Asp.net2.0 ウェブサイトの実行ソリューションに失敗しました。
-
不正なフォーマットでプログラムを読み込もうとした場合の問題を解決します。
-
vs2010 can't debug, can't enter breakpoint, breakpoint is invalid.
-
ASP.NET URL変更によるページ受け渡し
-
GDI+でジェネリックエラーが発生しました@System.Drawing.Image.RotateFlip