|
分類:[.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
|