C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: 一定間隔で動くtimerが時間内に終わらない場合の動き


(過去ログ 114 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■67466 / inTopicNo.1)  一定間隔で動くtimerが時間内に終わらない場合の動き
  
□投稿者/ たーくん (1回)-(2013/08/05(Mon) 12:59:24)

分類:[.NET 全般] 

前提:System.Windows.Forms.TimerのIntervalが100ms

オブジェクト名_Tickイベントのスレッドが100ms以上要した場合、
次の100msを迎えた時に、今動いていたスレッドは破棄されるのでしょうか?
それともスレッドは生きたままとなり、計2本のスレッドが生じてしまうのでしょうか?

後者の場合、スレッド数が際限なく増えてしまうのでしょうか?
引用返信 編集キー/
■67467 / inTopicNo.2)  Re[1]: 一定間隔で動くtimerが時間内に終わらない場合の動き
□投稿者/ Hongliang (76回)-(2013/08/05(Mon) 13:17:36)
System.Windows.Forms.Timerはすべてメインスレッドで動作します。
処理が溢れたら次の処理の始まりが遅れます。
ついでにUI操作が一切処理できないので、ユーザビリティ的にはとても残念なことになるでしょう。
なお、Tickイベントのハンドラ内で、メッセージキューが回ってしまうような処理、つまりApplication.DoEventsやMessageBox.Showをやってしまうと、それまでに来ていた後からきたタイマイベントの処理を始めることになったりします。

System.Timers.TimerおよびSystem.Threading.Timerは別スレッドで動作します。
これらの場合、新たにスレッドが作成されます(正確にはスレッドプールからあいているスレッドをもらってきます)。ですので並行動作が行われます。理屈上の上限はThreadPool.GetMaxThreadsになるかな?
ただしSystem.Timers.Timerは、デザイナでフォームなどにポトペタした場合は既定でElapsedイベントがメインスレッドで動作するようになるので、System.Windows.Forms.Timerと同じ問題を引き起こします。
引用返信 編集キー/
■67468 / inTopicNo.3)  Re[1]: 一定間隔で動くtimerが時間内に終わらない場合の動き
□投稿者/ 魔界の仮面弁士 (283回)-(2013/08/05(Mon) 13:26:02)
2013/08/05(Mon) 13:32:45 編集(投稿者)

No67466 (たーくん さん) に返信
> オブジェクト名_Tickイベントのスレッドが100ms以上要した場合、
> 次の100msを迎えた時に、今動いていたスレッドは破棄されるのでしょうか?
> それともスレッドは生きたままとなり、計2本のスレッドが生じてしまうのでしょうか?

どちらでもありません。

そもそも、System.Windows.Forms.Timer は UI スレッド(通常はメインスレッド)上で
動作します。Tick のためにワーカースレッドが生成されるわけではありませんので、
スレッドが 2 本になることはありませんし、元のスレッドが勝手に破棄される事もありません。
(仮に UI スレッドが破棄されるとすれば、Form ごと停止させられてしまいます)


Interval を超えて実行していた場合については、その最中にメッセージループが
処理されるかどうかによって変わりますが、通常は WM_TIMER メッセージが
そもそも処理されないため、次の Tick イベントの発生が遅延する事になります。

http://rucio.cloudapp.net/ThreadDetail.aspx?ThreadId=11058
引用返信 編集キー/
■67470 / inTopicNo.4)  Re[1]: 一定間隔で動くtimerが時間内に終わらない場合の動き
□投稿者/ shu (362回)-(2013/08/05(Mon) 13:36:39)
No67466 (たーくん さん) に返信
> 前提:System.Windows.Forms.TimerのIntervalが100ms
>
> オブジェクト名_Tickイベントのスレッドが100ms以上要した場合、
> 次の100msを迎えた時に、今動いていたスレッドは破棄されるのでしょうか?
> それともスレッドは生きたままとなり、計2本のスレッドが生じてしまうのでしょうか?
>
> 後者の場合、スレッド数が際限なく増えてしまうのでしょうか?
どうしたいのでしょうか?

Interval以上に時間がかかる処理をTimerで行うのはあまり良い方法ではないかと思います。
スレッドに時間のかかる処理を行わせ、Timerではスレッドの実行状況と制御を行うだけにすれば破棄するなり
新スレッドを作るなり終わっていたら次の動作を行わせるなり希望の動作を実装させることが出来るかと思います。
引用返信 編集キー/
■67481 / inTopicNo.5)  Re[2]: 一定間隔で動くtimerが時間内に終わらない場合の動き
□投稿者/ たーくん (2回)-(2013/08/06(Tue) 09:49:39)
Intervalを超える処理時間がかかった場合、
次のTickイベントの開始が遅れるということで了解しました。
望んでいる動きで問題ありません。
UIは実質使っておらず、バックグラウンド実行しているため、UI上も問題ありません。
ご回答ありがとうございます。

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -