0

前の質問で、スレッドを 1 ミリ秒中断する方法を教えてください。1ミリ秒の遅延を導入するには、タイマーを使用する必要があると回答されました。

「作業を行う」必要があり、平均で 2 ミリ秒 (1 ~ 5 ミリ秒で問題ありません。最大で数百ミリ秒の極端な遅延が発生することはほとんどありません) 待ってから、もう一度作業を行う必要があります。前の反復がまだ終了していないときに新しい反復を開始しようとしないことが重要です。そのため、1 ~ 5 ミリ秒ごとに何かを行う必要はありません。反復間に 1 ~ 5 ミリ秒の遅延が必要です。

私はそれを使用してそれをやろうとしましたが、うまくいきSystem.Timers.Timerません:

using System;
using System.Diagnostics;
using System.Threading;
using System.Timers;
using Timer = System.Timers.Timer;

namespace TestTimer
{
    class Program
    {
        static Timer refresh_timer;
        private static int called;
        private const int ITERATIONS = 100;
        private static Stopwatch sw;

        static void Main(string[] args)
        {
            refresh_timer = new Timer(1);
            refresh_timer.AutoReset = false;
            refresh_timer.Elapsed += OnRefreshTimedEvent;
            sw = Stopwatch.StartNew();
            refresh_timer.Start();
            Thread.Sleep(10000);
        }

        static void OnRefreshTimedEvent(object source, ElapsedEventArgs args)
        {
            DoGateIteration();
        }

        private static void DoGateIteration()
        {
            //try
            //{
                // work here
                called++;
            //}
            //finally
            //{
                if (called == ITERATIONS)
                {
                    Console.WriteLine("Average iterations per second: " + ITERATIONS * 1000 / sw.ElapsedMilliseconds);
                    Console.WriteLine("Average iterations milliseconds: " + sw.ElapsedMilliseconds / ITERATIONS);
                }
                refresh_timer.Start();
            //}
        }
    }
}

それは報告します:

Average iterations per second: 64
Average iterations milliseconds: 15

だからSystem.Timers.Timer、私が必要とするほど正確ではないようです。おそらく試してみるべきですが、このタイマーには必要なプロパティがSystem.Threading.Timerありません。AutoReset

何を提案しますか?

4

1 に答える 1

0

わずか 1 ミリ秒または 2 ミリ秒の短い遅延の場合は、単にビジー待機するのがおそらく最善です。

private static int called;
private const int ITERATIONS = 10000;
private static Stopwatch sw;

static void Main(string[] args)
{
    sw = Stopwatch.StartNew();

    var x = Stopwatch.StartNew();
    while (true)
    {
        DoGateIteration();

        x.Restart();
        while (x.ElapsedMilliseconds < 2) ; // busy-wait for 2 ms
    }
}

private static void DoGateIteration()
{
    called++;
    if (called == ITERATIONS)
    {
        Console.WriteLine("Average iterations per second: " + ITERATIONS * 1000 / sw.ElapsedMilliseconds);
        Console.WriteLine("Average iterations milliseconds: " + sw.ElapsedMilliseconds / ITERATIONS);
    }
}

出力:

1 秒あたりの平均反復回数: 500
平均反復ミリ秒: 2
于 2012-04-25T07:52:15.320 に答える