none
關於 System.Timers.Timer RRS feed

  • 問題

  • 各位先進好:

     

    請問我建立一個 System.Timers.Timer 的陣列

    Dim tTest(9) As System.Timers.Timer

     

    每個 Timer 的觸發時間都不同

     

    然後我分別用

    AddHandler tTest(0).Elapsed, AddressOf onSensorTimer

    AddHandler tTest(1).Elapsed, AddressOf onSensorTimer

    .

    .

    .

    AddHandler tTest(9).Elapsed, AddressOf onSensorTimer

    來設定事件觸發後處理的函數(onSensorTimer )

    所以每個 Timer 觸發後處理的函數都是 onSensorTimer

     

    因為每個 Timer 的觸發時間都不同,也就是 Interval 屬性都不一樣

     

    請問 我在 onSensorTimer 函數中該如何知道是 Timer 陣列中的哪一個 Timer 觸發的呢?

     

    希望大家可以指點小弟

    謝謝先進們

    2008年11月6日 上午 09:57

解答

  • 查了一下線上手冊,果然沒有 Name 屬性...

     

    看樣子是我原先的方式比較好,用公因數來跑~

     

    你的 Interval 如果都不一樣,則可以用這個屬性判斷。

     

    如果硬要照你原先的邏輯,線上手冊有不少類似的範例,你可以參考自訂控制項。一般就是:

    Code Snippet

     

    Public Class MyTimer

      ' 繼承 Timer

      Public Name As String

    End Class

     

    如果 Timer 沒有需要覆寫的,這樣就可以跑了,你就改用 MyTimer ...

     

    不過我想:

    Public Event Elapsed As ElapsedEventHandler

    這個應該是要覆寫,改送 MyTimer ,免得又把 Timer 送出去,Sender 一樣沒有 .Name ~
    2008年11月6日 下午 04:37
  • for i as integer = 0 to tTest.length -1
      if sender.equals(tTest(i)) then
        '做你要做的事
      end if
    next
    2008年11月7日 上午 01:23

所有回覆

  • 每個事件都有 sender 這個參數,可以知道是誰丟出來的。

     

    2008年11月6日 上午 10:25
    版主
  • 很怪的邏輯。

     

    用了一堆 Timer ,卻用同一個附程式來做邏輯判斷是哪個事件...

     

    那不如用公因數的 Timer (比如說每秒) ,在裡面作邏輯判斷。

     

    還可以減少系統資源的浪費。

     

     

    2008年11月6日 下午 01:17
  •  

    小朱 您好:

     

    我有試著在事件中使用 sender

    但是因為對 sender 不太熟悉

     

    只知道 sender.GetType() 能夠得知 "什麼型態" 的東西丟出這個事件

     

    能否教我該如何利用 sender 來知道誰產生這個事件

     

    謝謝您

     

    2008年11月6日 下午 01:56
  • sender.Name ?

     

    2008年11月6日 下午 02:41
  • 有一個方法叫 (sender as Control).ID (C#) 或是 CType(sender, Control).ID (VB)

    2008年11月6日 下午 03:11
    版主
  • 小朱大哥 您好:

     

    用了這個方法之後,顯示「ID 不是System.Windows.Forms.Control 的成員」的錯誤

    不知道我是不是那邊寫錯了

    謝謝您

     

    Private Sub onSensorTimer(ByVal sender As Object, ByVal e As System.Timers.ElapsedEventArgs)

            Dim controlName As String = CType(sender, Control).ID

    End Sub

     

    我也改成

     

    Private Sub onSensorTimer(ByVal sender As Object, ByVal e As System.Timers.ElapsedEventArgs)

            Dim controlName As String = CType(sender, System.Timers.Timer).?  ←裡面沒有 ID 或是 NAME 的成員

    End Sub

    2008年11月6日 下午 03:29
  • 您好:

     

    我也試著用 sender.Name

    但是執行時跳出錯誤訊息

     

    因為 System.Timers.Timer 這個類別裡面沒有 Name 這個成員

     

    謝謝您的幫忙

    2008年11月6日 下午 03:59
  • 查了一下線上手冊,果然沒有 Name 屬性...

     

    看樣子是我原先的方式比較好,用公因數來跑~

     

    你的 Interval 如果都不一樣,則可以用這個屬性判斷。

     

    如果硬要照你原先的邏輯,線上手冊有不少類似的範例,你可以參考自訂控制項。一般就是:

    Code Snippet

     

    Public Class MyTimer

      ' 繼承 Timer

      Public Name As String

    End Class

     

    如果 Timer 沒有需要覆寫的,這樣就可以跑了,你就改用 MyTimer ...

     

    不過我想:

    Public Event Elapsed As ElapsedEventHandler

    這個應該是要覆寫,改送 MyTimer ,免得又把 Timer 送出去,Sender 一樣沒有 .Name ~
    2008年11月6日 下午 04:37
  • System.Timers.Timer 沒有 ID 和 Name ... (System.Windows.Forms.Timer 有),所以你可能要分數個事件常式來做比較方便。

     

    2008年11月6日 下午 11:55
    版主
  • for i as integer = 0 to tTest.length -1
      if sender.equals(tTest(i)) then
        '做你要做的事
      end if
    next
    2008年11月7日 上午 01:23
  •  

    感謝   心冷熱情熄    小朱   LonghairPan  三位先進的幫忙

     

    繼承的方法真是高招,我會再試試看

     

    不過

    sender.Equals(aTimer(i))

    這個方法真是快速

    解決了我的問題

     

    謝謝各位

    2008年11月8日 下午 04:36