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

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

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

Re[3]: Windowsタイマとスレッドタイマの違い


(過去ログ 27 を表示中)

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

■12652 / inTopicNo.1)  Windowsタイマとスレッドタイマの違い
  
□投稿者/ タカ (1回)-(2008/01/14(Mon) 02:00:05)

分類:[.NET 全般] 

一定感覚で処理を実行させようと思っています。
<要件>
・通常は1秒もかからない処理(関数A)を連続で実行させるため、タイマ感覚は適当に5秒くらい。
・ただ、たまにデータ量が増えるため、5秒を過ぎる可能性も十分にある。
・その場合は処理を実行せずに、再度指定間隔後(5秒)に処理を実行する。
・ボタンを押すと、タイマは一時停止する。

そこで、タイマを使用しようと思っているのですが、Windowsタイマとスレッドタイマの違いがよくわかりません。
Windowsタイマだと、なんとなくCPU仕様率が上がる気がしたため、スレッドタイマを用いて以下のように
してみました。
スレッドタイマでやってみて思ったのは、常に指定間隔(5秒)で実行し、SyncLockの部分で処理が
順にたまっていっている気がします。溜まるのもよくないと思いフラグを設けましたが、何かスレッドタイマを
使うメリットが無いような気もします。。。
ちなみにですが、このように処理が溜まっていく過程が、スレッドプールというものなのでしょうか?


一応これで動いていますが、「タイマがまだ処理中だ」と判定する良い方法は無いでしょうか?
後、プログラムを終了させるとたまに「invoke」の部分でエラーが発生します。
こちらも回避したいのですが・・・
何かアドバイスをお願いします。


Imports System
Imports System.Threading

Public Class Form1
Public Delegate Sub setText1(ByVal s As String)

Private ReadOnly ResourceEntry As New Object

Private FlgEntry As Boolean = False

Private Sub MainForm_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
mainProcess()
End Sub

Private Sub mainProcess()
Dim Timer As New TimerCallback(AddressOf GetList)
Dim timer1 As New Timer(Timer, nothing, 100, 5000)
End Sub

Private Sub GetList(ByVal state As Object)
Dim dlg As New setText1(AddressOf insertText1)

If Not FlgEntry Then
SyncLock ResourceEntry
'処理中フラグON
FlgEntry = True

'ここで何かの処理。通常は1秒以下。たまに数秒。

Me.Invoke(dlg, New Object() {処理結果の文字列})


'ここで、別スレッドを起動して処理させる予定


'処理中フラグOFF
FlgEntry = False
End SyncLock
End If
End Sub

Private Sub insertText1(ByVal s As String)
TextBox1.AppendText(s)
End Sub

End Class

引用返信 編集キー/
■12657 / inTopicNo.2)  Re[1]: Windowsタイマとスレッドタイマの違い
□投稿者/ Tom Yama (11回)-(2008/01/14(Mon) 11:36:40)
No12652 (タカ さん) に返信
> Windowsタイマだと、なんとなくCPU仕様率が上がる気がしたため、スレッドタイマを用いて以下のように
本当ですか?試してみたんですか?

> そこで、タイマを使用しようと思っているのですが、Windowsタイマとスレッドタイマの違いがよくわかりません。
実際に試してみれば、わかると思います。

引用返信 編集キー/
■12659 / inTopicNo.3)  Re[1]: Windowsタイマとスレッドタイマの違い
□投稿者/ Azulean (9回)-(2008/01/14(Mon) 12:19:40)
> そこで、タイマを使用しようと思っているのですが、Windowsタイマとスレッドタイマの違いがよくわかりません。

http://msdn2.microsoft.com/ja-jp/library/system.threading.timer(VS.80).aspx
タイマによって実行されるコールバック メソッドは、ThreadPool スレッドで呼び出されるため、再入可能である必要があります。タイマ間隔がコールバックの実行に必要な時間よりも小さい場合、または、スレッド プール スレッドがすべて使用中でコールバックが複数回キューに置かれる場合は、コールバックを 2 つのスレッド プール スレッドで同時に実行できます。

http://msdn2.microsoft.com/ja-jp/library/system.windows.forms.timer(VS.80).aspx
Timer は、ユーザー定義の間隔でイベントを発生させるために使用されます。この Windows タイマは、UI スレッドを使用して処理を実行するシングルスレッド環境に合わせて設計されています。


前者は複数のスレッドで実行されることがあり、後者は必ずUIスレッドでしか実行されない言う大きな違いがあります。
引用返信 編集キー/
■12665 / inTopicNo.4)  Re[2]: Windowsタイマとスレッドタイマの違い
□投稿者/ タカ (2回)-(2008/01/14(Mon) 15:31:00)
お返事、ありがとうございます。

>Tom Yamaさん
試してみたのですが、見た目上は何も変わってないため、何が違うのだろうか?と思い、質問させていただきました。
もう少し調べてみます。

>Azuleanさん
Windowsタイマを使ったほうがよさそうですね。
家に帰ってMSDNをよく読んでみます。
引用返信 編集キー/
■12666 / inTopicNo.5)  Re[3]: Windowsタイマとスレッドタイマの違い
□投稿者/ Tom Yama (12回)-(2008/01/14(Mon) 15:45:04)
No12665 (タカ さん) に返信
> >Tom Yamaさん
> 試してみたのですが、見た目上は何も変わってないため、何が違うのだろうか?と思い、質問させていただきました。
うーん。そうなの?

Forms.Timerでも、
> スレッドタイマでやってみて思ったのは、常に指定間隔(5秒)で実行し、SyncLockの部分で処理が
常に5秒間隔で、処理が走りますか?

> ・ただ、たまにデータ量が増えるため、5秒を過ぎる可能性も十分にある。
この場合、前の処理が終了していない状態で、新しい処理が走ったりしますか?
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -