4
  1. C# で高解像度の周波数 (100 マイクロ秒ごとなど) でメソッドを実行する方法はありますか?

  2. 異なる周波数での 2 つの異なるメソッド、たとえば、0.1 ms ごとの Method1 と 0.3 ms ごとの Method2 についてはどうでしょうか。

Systems.Timers.TimerMSDN には、次のようなクラスへのイベント ハンドラーのアタッチに関するドキュメントがあります。

public static void Main()
{

    System.Timers.Timer aTimer = new System.Timers.Timer();
    aTimer.Elapsed += new ElapsedEventHandler(Method);
    aTimer.Interval = 2000;
    aTimer.Enabled = true;
    GC.KeepAlive(aTimer);
}

しかしSystem.Timers.Timer、ベンチマークしたときの精度は15〜16ミリ秒しかありません。StopwatchCPU のパフォーマンス カウンターの精度は 0.1 ミリ秒以下ですが、クラスにイベント ハンドラーをアタッチする方法が見つかりません。

また、2 つのメソッドを異なる頻度で実行するときに注意する必要があるスレッドの問題はありますか?

ありがとう!

4

3 に答える 3

3

見苦しいですが、ストップウォッチ ElapsedTicks を使用する機会があるかもしれません。

Stopwatch w = new Stopwatch()
long nextTick = 0;
long ticksPerMicroSecond = 1000000L / Stopwatch.Frequency; // Number of ticks per microsec.
long periodInTicks = ticksPerMicroSecond / 100; // Ticks per 0.1ms

while(true)
{
  long currentTick = w.ElapsedTicks.
  if (currentTick  > nextTick)
  {
    nextTick = currentTick + periodInTicks;
    // Do something here.
  }
}

それは可能な限り醜いものであり、while(true) ループが発生し、おそらく 100% の CPU を無料で使用します (マルチコアでこれを実行することをお勧めします)。

少しベンチマークを行って (Stopwatch.Frequency msdn doc の例を参照)、タイマーの精度を確認し、内部関数の遅れによるドリフトを確認することをお勧めします。GC がスレッドをブロックしないように、バックグラウンド GC を有効にすることもできます。これはコードで実行可能であることを示していますが、関数を 0.1 ミリ秒未満で実行できるかどうかはわかりません。

于 2012-12-20T09:59:10.070 に答える
2

これは不可能です。Windows はリアルタイム オペレーティング システムではありません。

于 2012-12-20T05:06:56.200 に答える
-2

ありえない。あなたは、MS の開発者が妥当と考える水準を下回っています。

最新のハードウェアを想定して、できる最善の方法は TIMErQueue、HPET です。BIOSで無効にできるので、微調整が必​​要になる場合があります。

http://msdn.microsoft.com/en-us/library/windows/desktop/ms686796(v=vs.85).aspx

利用可能な .NET API はありませんが、これは Interop を介して簡単にマップできます。

つまり、タイミング パラメータには int 期間があり、ミリ秒単位で指定されるため、1 ミリ秒の分解能についてのみ説明します。そして、ハードウェアがそれを行うかどうかは、主に年齢に依存します.

申し訳ありませんが、それはあなたが得ることができる最高のものです。

于 2012-12-20T05:30:33.457 に答える