- PR -

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

投稿者投稿内容
コバ
会議室デビュー日: 2007/06/18
投稿数: 7
投稿日時: 2007-06-18 18:04
引用:

かるあさんの書き込み (2007-06-18 16:54) より:
こんなかんじ?
コード:
   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 なんですか?



早速、ありがとうございます。
早速、記述して確認したのですが、「aTimerが宣言されていません」とエラーなってしまいます。
たぶん、スコープの問題だと思うのですが、最近、VB.NETを始めたばかりで、よく理解できておりません。
さらなる勉強をいたしますが、もう少しだけご教授ください。
イベント処理の中で、aTimerと比較するには、どうしたらよいでしょうか?
コバ
会議室デビュー日: 2007/06/18
投稿数: 7
投稿日時: 2007-06-18 19:56
引用:

一郎さんの書き込み (2007-06-18 17:17) より:
マイクロソフトのイベントのガイドラインでは、イベントの第一引数としてそのイベントを発生させたオブジェクトを渡すように言われています。
Timerクラスでもそのような実装になっています。
つまり、OnTimedEventイベントハンドラが呼ばれたとき、その第一引数に原因になったタイマークラスのオブジェクトが渡されてくるはずです。
ですので、それがふたつのTimerオブジェクトのどちらかを判断すれば良いです。
ObjectクラスのEquals()メソッドは、同じオブジェクトかどうかを調べます。

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



一郎さん レスポンスありがとうございます。
オブジェクトの比較をすることは理解できました。
それで、いろいろ調べているのですが、VB.NET初心者のため、今回のイベントハンドラの中で、引数であるsource と元のaTimer をどのように比較すれば良いのか、ご教授いただけませんでしょうか?
aTimer をプロシージャーの外で宣言してみたのですが、エラーになってしまいます。
かるあ
ぬし
会議室デビュー日: 2003/11/16
投稿数: 1190
お住まい・勤務地: センガワ→ムサシノ
投稿日時: 2007-06-18 22:09
引用:

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

早速、ありがとうございます。
早速、記述して確認したのですが、「aTimerが宣言されていません」とエラーなってしまいます。


あれ?僕の最初の返信で
引用:

コバさんの書き込み (2007-06-18 16:03) より:
メンバ変数はわかりますが、具体的にどのような記述をしたらよいでしょうか?


となっていたので、aTimer と bTimer を Form1 のメンバにする記述は省いちゃったんですけれど。。。
ということで、
引用:

たぶん、スコープの問題だと思うのですが、最近、VB.NETを始めたばかりで、よく理解できておりません。


スコープの問題ですので、問題ないところに aTimer と bTimer を移動してください。
_________________
かるあ のメモスニペット
コバ
会議室デビュー日: 2007/06/18
投稿数: 7
投稿日時: 2007-06-18 22:37
Subプロシージャーの外で、下記の宣言をして、
Private Shared aTimer As New System.Windows.Forms.Timer()
Private Shared bTimer As New System.Windows.Forms.Timer()

タイマーイベントハンドラ内で、下記記述をしたところ、うまく選択できました。
いろいろありがとうございました。
If source.Equals(aTimer) Then
Debug.WriteLine("aTimer elapsed")
ElseIf source.Equals(bTimer) Then
Debug.WriteLine("bTimer elapsed")
End If

関連して、もう少しだけ、ご教授願いたいのですが、
Subプロシージャーの外の宣言を、aTimer,bTimer ではなく aTimer() のような配列にしたいのですが、どのように記述したら良いでしょうか?
一般的な変数の配列はわかるのですが、今回のようなタイマーオブジェクトの配列をどのように、宣言すればよいのか、いろいろ試していますが、解決できておりません。
↓のようでは、当然だめですよね
Private Shared aTimer(5) As New System.Windows.Forms.Timer()

お手数おかけいたします。よろしくお願いいたします。
かるあ
ぬし
会議室デビュー日: 2003/11/16
投稿数: 1190
お住まい・勤務地: センガワ→ムサシノ
投稿日時: 2007-06-19 00:57
引用:

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

Subプロシージャーの外の宣言を、aTimer,bTimer ではなく aTimer() のような配列にしたいのですが、どのように記述したら良いでしょうか?
一般的な変数の配列はわかるのですが、今回のようなタイマーオブジェクトの配列をどのように、宣言すればよいのか、いろいろ試していますが、解決できておりません。



一般的な変数っていうのが何かはわかりませんが、特に変わりはないと思いますよ。
ガワを作って中身を入れてあげればいいわけですから。
コード:
        Dim timers(4) As System.Timers.Timer
        For index As Integer = 0 To timers.Length - 1
            timers(index) = New System.Timers.Timer
        Next


List(Of T)などのコレクションを使うのもいいと思います。

このあたりは入門本や入門サイトにトピックがあると思うので、のぞいてみるといいですよ。
_________________
かるあ のメモスニペット
コバ
会議室デビュー日: 2007/06/18
投稿数: 7
投稿日時: 2007-06-19 01:40
引用:

かるあさんの書き込み (2007-06-19 00:57) より:
一般的な変数っていうのが何かはわかりませんが、特に変わりはないと思いますよ。
ガワを作って中身を入れてあげればいいわけですから。
コード:
        Dim timers(4) As System.Timers.Timer
        For index As Integer = 0 To timers.Length - 1
            timers(index) = New System.Timers.Timer
        Next


List(Of T)などのコレクションを使うのもいいと思います。

このあたりは入門本や入門サイトにトピックがあると思うので、のぞいてみるといいですよ。




ありがとうございます。
質問の前に、自分でも同じようなコード書いてみたのですが、なぜかエラーになってしまいました。
かるあさんのを参考に再度コード書いたら、うまくいきました。
初歩的ミスかと思われます。
大変失礼しました。
ありがとうございました。

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