PR

C#Timerの使い方

記事内に広告が含まれています。

System.Windows.Forms.Timerを使用して指定した時間間隔で処理を行います。
厳密に一定の間隔で処理が実行されるわけではないので注意が必要です。
Microsoft Learnを参考にしています。

Timer クラス (System.Windows.Forms) | Microsoft Learn

Timerの基本的な使い方

タイマの動作間隔と実行するイベントを設定し、タイマを開始させます。
・Intervalにミリ秒単位で時間間隔を設定します。
 int型で1以上を設定します。
 1未満を設定するとArgumentOutOfRangeExceptionが発生します。
・Tickに実行するイベントを設定します。
 EventHandlerを設定しますが、お決まりのようなのであまり深く考えずに設定します。
 実行間隔を確認するためコード例ではテキストボックスに実行したときの時間を追加するような内容とします。
・Start()するかEnabledをtrueにすることでタイマが開始します。
 Start()の定義を見ればわかりますが、「public void Start() => Enabled = true;」となっているためどちらでも開始します。

参考用のコード例です。

    public partial class Form1 : Form
    {
        System.Windows.Forms.Timer timer;
        public Form1()
        {
            InitializeComponent();

            timer = new System.Windows.Forms.Timer();
            // ミリ秒単位でタイマの間隔を指定する
            timer.Interval = 1000;
            // タイマで実行するイベントを設定する
            timer.Tick += new EventHandler(TimerEventProcessor);
            // タイマを開始する
            timer.Start();
        }

        // タイマで実行されるイベント
        private void TimerEventProcessor(object sender, EventArgs e)
        {
            //テキストボックスに実行された時の分、秒、ミリ秒を追加する
            textBox1.Text += DateTime.Now.ToString("mm:ss.fff") + "\r\n";
        }
    }

ちょっとボタンを追加していますが、実行例です。
大体1秒間隔で実行されていることがわかります。

実行間隔について

お手軽に一定間隔でイベントを実行することができますが、あまり精度は良くありません。
1msec間隔を指定して実行した場合でも下の画像のように15msec前後の間隔となります。
(ばらつき具合は実行時の状況や環境によります)

では15msecを指定したときはどうなるかといえば1msecとほぼ同じとなります。

違いが起きるのが16msecを指定したときでほぼ31msec前後の間隔でイベントが起きます。
たまに15msec前後となります。

同じように31msecと32msecの場合で実行すると実行間隔に差が起きます。
そのため16msecの倍数を境に実行間隔が変わると考えてよさそうです。

Windows フォーム Timer コンポーネントはシングル スレッドであり、55 ミリ秒の精度に制限されています。 より精度の高いマルチスレッド タイマーが必要な場合は、 名前空間の クラスをSystem.Timers使用Timerします。

Timer クラス (System.Windows.Forms) | Microsoft Learn

Microsoft Learnには55ミリ秒の精度と書かれていますが、実際にはもう少し良いような気もします。
何はともあれ、厳密な間隔で動作しないことに注意は必要です。
精度が必要な時はQueryPerformanceCounterとかを使用します。
気が向いたらメモ程度に記載します。

タイトルとURLをコピーしました