none
複数タイマーの動作について RRS feed

  • 質問

  • 初歩的な質問で恐縮ですが、タイマーを2個使用しています。

    一方のタイマー割り込み処理を実行中、もう一方のタイマー割り込み

    が発生することがあるのでしょうか?

     

    具体的にはタイマー割り込み処理中に、もう一方のタイマー割り込み

    処理の完了を待つことが必要なのでしょうか?

     

    2008年1月7日 4:38

回答

  • 使っているタイマの種類(クラス名は大抵 Timer でしょうから、その属している名前空間で見分けられます)とタイマのイベントハンドラ内の記述次第です。

    2008年1月7日 6:12
  •  

    スレッドタイマー使うなら割り込みあるでしょうが、

    Formsのタイマーなら割り込まれないですよ。

    Tickイベントが発生した順番に処理します。

    2008年1月7日 6:13
  •  みつお さんからの引用

    初歩的な質問で恐縮ですが、タイマーを2個使用しています。

    一方のタイマー割り込み処理を実行中、もう一方のタイマー割り込み

    が発生することがあるのでしょうか?


    タイマーとは System.Windows.Forms.Timer のことでしょうか?

    いずれにせよ実際にソースを書いてお試しになると良いです。

    C#

    private void timer1_Tick(object sender, System.EventArgs e) {
        System.Console.WriteLine("Timer1_Tick()_Begin");

        //時間のかかる処理

        for (int i = 0; i <= 100; i++) {
            System.Threading.Thread.Sleep(10);
        }


        System.Console.WriteLine("Timer1_Tick()_End");
    }

     

    private void timer2_Tick(object sender, System.EventArgs e) {
        System.Console.WriteLine("Timer2_Tick()_Begin");
        System.Console.WriteLine("Timer2_Tick()_End");
    }

     

    適当に時間のかかりそうな処理を入れてみるとかですね。
    ついでに、for の中で System.Windows.Forms.Application.DoEvents メソッドを入れて挙動を比較してみると面白いかもしれません。

    2008年1月7日 6:24

すべての返信

  • 使っているタイマの種類(クラス名は大抵 Timer でしょうから、その属している名前空間で見分けられます)とタイマのイベントハンドラ内の記述次第です。

    2008年1月7日 6:12
  •  

    スレッドタイマー使うなら割り込みあるでしょうが、

    Formsのタイマーなら割り込まれないですよ。

    Tickイベントが発生した順番に処理します。

    2008年1月7日 6:13
  •  みつお さんからの引用

    初歩的な質問で恐縮ですが、タイマーを2個使用しています。

    一方のタイマー割り込み処理を実行中、もう一方のタイマー割り込み

    が発生することがあるのでしょうか?


    タイマーとは System.Windows.Forms.Timer のことでしょうか?

    いずれにせよ実際にソースを書いてお試しになると良いです。

    C#

    private void timer1_Tick(object sender, System.EventArgs e) {
        System.Console.WriteLine("Timer1_Tick()_Begin");

        //時間のかかる処理

        for (int i = 0; i <= 100; i++) {
            System.Threading.Thread.Sleep(10);
        }


        System.Console.WriteLine("Timer1_Tick()_End");
    }

     

    private void timer2_Tick(object sender, System.EventArgs e) {
        System.Console.WriteLine("Timer2_Tick()_Begin");
        System.Console.WriteLine("Timer2_Tick()_End");
    }

     

    適当に時間のかかりそうな処理を入れてみるとかですね。
    ついでに、for の中で System.Windows.Forms.Application.DoEvents メソッドを入れて挙動を比較してみると面白いかもしれません。

    2008年1月7日 6:24
  • ご回答ありがとうございました。

    使用しているのはTimerですが、割り込み処理(ハンドラ)は

    別々にしていますので、同時割り込みがあった場合、

    同期を取る必要があるので、今回の質問になりました。

     

    2008年1月7日 6:43
  • ご回答ありがとうございました。

    Timerを使用しています。(スレッドは使用していません)

    これで安心してイージーな作りこみができます。

     

    2008年1月7日 6:47
  • ソースコードまで添付していただきまして、ありがとうございます。

    ご指摘通りSystem.Windows.Forms.Timer を使用しています。

    結果は予想できていたのですが、確信が持てなかったので、

    質問させていただきました。

    「タイマー多重割り込みは発生しない。」という結論で締めました。

     

     

    2008年1月7日 6:59
  • 丁寧なご返信ありがとうございます。

     

     みつお さんからの引用

    ソースコードまで添付していただきまして、ありがとうございます。

    ご指摘通りSystem.Windows.Forms.Timer を使用しています。

    結果は予想できていたのですが、確信が持てなかったので、質問させていただきました。

    「タイマー多重割り込みは発生しない。」という結論で締めました。


    先ほど少し書いたように System.Windows.Forms.Application.DoEvents メソッドなど特殊な (本当に特殊だ...)
    場合には (割り込みとは言えないかもしれませんが) 起こり得るのでご注意ください。

    2008年1月7日 8:56
  • 外池と申します。

     

    じゃんぬねっとさんが仰る「特殊な場合」に、ひとつ追加させてください。

     

    Forms.TimerのTickイベントをハンドリングする際に、MsgBoxを表示させてユーザーの入力を要求するような場合には、注意してください。

     

    以前、まったく別のスレッドで他の方から教えて頂いたのですが、MsgBoxを表示している間には、別途イベントを拾うループが回りますので、

     

    他のタイマーのイベントが発生した場合に処理されてしまいますし、最悪、自身のタイマーのイベントが再度発生して同じ処理を始めてしまう(「再入」と呼ばれます。MsgBoxが次々と現れるような現象になります)ことがあります。

     

     

     

    2008年1月7日 9:10
  • アドバイスありがとうございました。

    直面する処理はタイマー2個だけで、簡単に実現しました。

    お礼が遅れまして申し訳ありませんでした。

    またお世話になります。

     

     

    2008年1月11日 6:02
  •  外池 さんからの引用

    外池と申します。

     

    じゃんぬねっとさんが仰る「特殊な場合」に、ひとつ追加させてください。

     

    Forms.TimerのTickイベントをハンドリングする際に、MsgBoxを表示させてユーザーの入力を要求するような場合には、注意してください。

     

    以前、まったく別のスレッドで他の方から教えて頂いたのですが、MsgBoxを表示している間には、別途イベントを拾うループが回りますので、

     

    他のタイマーのイベントが発生した場合に処理されてしまいますし、最悪、自身のタイマーのイベントが再度発生して同じ処理を始めてしまう(「再入」と呼ばれます。MsgBoxが次々と現れるような現象になります)ことがあります。

     

     

     

     

    貴重なご意見ありがとうございました。

    注意して実現しようと思います。

    また、お世話になります。

     

    2008年1月11日 6:06