トップ回答者
複数タイマーの動作について

質問
回答
-
みつお さんからの引用 初歩的な質問で恐縮ですが、タイマーを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 メソッドを入れて挙動を比較してみると面白いかもしれません。
すべての返信
-
みつお さんからの引用 初歩的な質問で恐縮ですが、タイマーを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 メソッドを入れて挙動を比較してみると面白いかもしれません。 -
丁寧なご返信ありがとうございます。
みつお さんからの引用 ソースコードまで添付していただきまして、ありがとうございます。
ご指摘通りSystem.Windows.Forms.Timer を使用しています。
結果は予想できていたのですが、確信が持てなかったので、質問させていただきました。
「タイマー多重割り込みは発生しない。」という結論で締めました。
先ほど少し書いたように System.Windows.Forms.Application.DoEvents メソッドなど特殊な (本当に特殊だ...)
場合には (割り込みとは言えないかもしれませんが) 起こり得るのでご注意ください。 -
外池と申します。
じゃんぬねっとさんが仰る「特殊な場合」に、ひとつ追加させてください。
Forms.TimerのTickイベントをハンドリングする際に、MsgBoxを表示させてユーザーの入力を要求するような場合には、注意してください。
以前、まったく別のスレッドで他の方から教えて頂いたのですが、MsgBoxを表示している間には、別途イベントを拾うループが回りますので、
他のタイマーのイベントが発生した場合に処理されてしまいますし、最悪、自身のタイマーのイベントが再度発生して同じ処理を始めてしまう(「再入」と呼ばれます。MsgBoxが次々と現れるような現象になります)ことがあります。
-
外池 さんからの引用 外池と申します。
じゃんぬねっとさんが仰る「特殊な場合」に、ひとつ追加させてください。
Forms.TimerのTickイベントをハンドリングする際に、MsgBoxを表示させてユーザーの入力を要求するような場合には、注意してください。
以前、まったく別のスレッドで他の方から教えて頂いたのですが、MsgBoxを表示している間には、別途イベントを拾うループが回りますので、
他のタイマーのイベントが発生した場合に処理されてしまいますし、最悪、自身のタイマーのイベントが再度発生して同じ処理を始めてしまう(「再入」と呼ばれます。MsgBoxが次々と現れるような現象になります)ことがあります。
貴重なご意見ありがとうございました。
注意して実現しようと思います。
また、お世話になります。