- PR -

VB.NET 複数タイマーの処理について

投稿者投稿内容
コバ
会議室デビュー日: 2007/06/18
投稿数: 7
投稿日時: 2007-06-18 15:15
いつも大変有意義に拝見させていただいております。
こちらには初めて書き込みさせていただきます。

早速ですが、質問させていただきます。
VB.NET 2005にて、複数のタイマーを起動して、共通のタイマーイベントルーチンで処理したいのですが、どのようにすればよいかわかりません。

2つのタイマーを起動した場合、1つのタイマーイベントルーチンで、どちらのタイマーからの割り込みかを判断する方法はありませんでしょうか?

タイマーに関係するところだけ抽出します。
MSDNやVB.NETをいろいろ調べておりますが、どうしてもわからないため質問させていただきます。
ご教授のほど、よろしくお願いいたします。

Imports System
Imports System.Timers

Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
 Dim aTimer As New System.Timers.Timer()
Dim bTimer As New System.Timers.Timer()

' Hook up the Elapsed event for the timer.
AddHandler aTimer.Elapsed, AddressOf OnTimedEvent
AddHandler bTimer.Elapsed, AddressOf OnTimedEvent

' Set the Interval to 2 seconds (2000 milliseconds).
aTimer.Interval = 20000
aTimer.Enabled = True

bTimer.Interval = 10000
bTimer.Enabled = True

End Sub

Private Shared Sub OnTimedEvent(ByVal source As Object, ByVal e As ElapsedEventArgs)
'この中で、aTimer , bTimer からのイベント処理を区別したいのです

End Sub
mio
ぬし
会議室デビュー日: 2005/08/25
投稿数: 734
お住まい・勤務地: 神奈川県
投稿日時: 2007-06-18 15:46
メソッドの引数は?
かるあ
ぬし
会議室デビュー日: 2003/11/16
投稿数: 1190
お住まい・勤務地: センガワ→ムサシノ
投稿日時: 2007-06-18 15:57
Timer を メンバ変数にして、
source.Equals(aTimer)
で判断するとか

関係ないかもしれないけれどこれだと20秒止まらない?
_________________
かるあ のメモスニペット
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2007-06-18 15:57
イベントハンドラの第一引数を見ればよろしいかと。
コバ
会議室デビュー日: 2007/06/18
投稿数: 7
投稿日時: 2007-06-18 16:03
引用:

かるあさんの書き込み (2007-06-18 15:57) より:
Timer を メンバ変数にして、
source.Equals(aTimer)
で判断するとか

関係ないかもしれないけれどこれだと20秒止まらない?




早速ありがとうございます。
.NETは、まだ初心者のため、お手数おかけいたしますが、もう少し具体的にご教授いただけませんでしょうか?
メンバ変数はわかりますが、具体的にどのような記述をしたらよいでしょうか?
コバ
会議室デビュー日: 2007/06/18
投稿数: 7
投稿日時: 2007-06-18 16:05
引用:

渋木宏明(ひどり)さんの書き込み (2007-06-18 15:57) より:
イベントハンドラの第一引数を見ればよろしいかと。




早速ありがとうございます。
ウォッチで、イベントハンドラの第一引数を確認したのですが、
aTimer , bTimer での違いがわかりませんでした。
どれかの引数(メンバ変数)を確認することで、違いがわかるのでしょうか?
よろしくお願いいたします。
かるあ
ぬし
会議室デビュー日: 2003/11/16
投稿数: 1190
お住まい・勤務地: センガワ→ムサシノ
投稿日時: 2007-06-18 16:54
引用:

コバさんの書き込み (2007-06-18 16:03) より:

.NETは、まだ初心者のため、お手数おかけいたしますが、もう少し具体的にご教授いただけませんでしょうか?
メンバ変数はわかりますが、具体的にどのような記述をしたらよいでしょうか?



こんなかんじ?
コード:
   Private Sub OnTimedEvent(ByVal source As Object, ByVal e As System.Timers.ElapsedEventArgs)
        If source.Equals(aTimer) Then
            Debug.WriteLine("aTimer elapsed")
        ElseIf source.Equals(bTimer) Then
            Debug.WriteLine("bTimer elapsed")
        End If
  End Sub


あれ? OnTimedEvent ってなんで Shared なんですか?

_________________
かるあ のメモスニペット
一郎
ぬし
会議室デビュー日: 2002/10/11
投稿数: 1081
投稿日時: 2007-06-18 17:17
マイクロソフトのイベントのガイドラインでは、イベントの第一引数としてそのイベントを発生させたオブジェクトを渡すように言われています。
Timerクラスでもそのような実装になっています。
つまり、OnTimedEventイベントハンドラが呼ばれたとき、その第一引数に原因になったタイマークラスのオブジェクトが渡されてくるはずです。
ですので、それがふたつのTimerオブジェクトのどちらかを判断すれば良いです。
ObjectクラスのEquals()メソッドは、同じオブジェクトかどうかを調べます。

あと、イベントハンドラにOnXXXXXという名前を付けないでください。
ガイドラインでは、イベントを発生させるメソッドにOnXXXXXという名前を付けるように言われていますので紛らわしいです。
参考:
http://msdn2.microsoft.com/ja-jp/library/ms229011(VS.80).aspx

[ メッセージ編集済み 編集者: 一郎 編集日時 2007-06-18 17:18 ]

スキルアップ/キャリアアップ(JOB@IT)