none
Timer1控件循環問題 RRS feed

  • 問題

  • 想請問為什麼Timer1控件循環了兩次到3次就不會在循環了 很奇怪

      Dim outTime As String
      Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        startlist()
      End Sub
    
      Private Sub startlist()
        outTime = NumericUpDown1.Value
        For i As Integer = 0 To ListBox1.Items.Count - 1
          Me.Text = "目前被開啟網址 " & i + 1 & " & 網址總數 " & ListBox1.Items.Count
          ListBox1.SelectedIndex = i
          Dim url As String = ListBox1.Items(i).ToString()
          start(url)
          Timer1.Enabled = True
          Timer1.Start()
        Next
      End Sub
    
      Private Sub start(ByVal url As String)
        Dim s As New Thread(New ParameterizedThreadStart(AddressOf BeginCatch))
        s.SetApartmentState(ApartmentState.STA)
        s.Start(url)
      End Sub
    
      Public Sub BeginCatch(ByVal obj As Object)
        Dim ok As New EventHandler(AddressOf invokeok)
        Me.Invoke(ok, obj)
      End Sub
    
      Public Sub invokeok(ByVal obj As Object, ByVal e As EventArgs)
        Dim url As String = obj.ToString()
        Dim wb As System.Windows.Forms.WebBrowser = New WebBrowser()
        wb.Navigate(url)
        TableLayoutPanel1.Controls.Add(wb)
      End Sub
    
      Private Sub Timer1_Tick_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        outTime -= 1
        TextBox1.Text = outTime
        If outTime = 0 Then
          Timer1.Enabled = False
          'disconnection()
          TbClear()
          Me.Button1_Click(sender, e)
        End If
      End Sub
    

    這個我試好幾次

    他的時間到計時完畢在去Button1只會動作兩次

    就不會在循環倒數

    不知道那裡出問題耶

    2011年3月21日 上午 06:11

解答

  • Private Sub Timer1_Tick_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        outTime -= 1
        TextBox1.Text = outTime
        If outTime = 0 Then
          Timer1.Enabled = False
          'disconnection()
          TbClear()
          Me.Button1_Click(sender, e)
        End If
      End Sub

     

    上面粗體字的部份讓我有一個很大的疑問:

    (1) 你怎不直接呼叫   startlist() 就好了 ?

    (2) 你這樣的寫法很奇特, 因為這時你傳給Button1 Click 事件委派函式的引數全都是錯的. 你如果非得這樣click 一下 Button1不可, 改用 Button.PerformClick 方法 去做

    (3) 我不知道你有沒有先試過把Interval拉長看看就下了你在上文的結論 ? 因為如果你不試, 我也無從判斷起這個可能原因是不是對的, 另一個可能性是因為 Windows.Forms.Timer 和 UI 使用同一個訊息迴圈, 也有可能是因為資源使用量太大導致訊息迴圈停住了. (你可試著用System.Timers.Timer 或 Threading.Timer 去取代Forms.Timer看看)

    (4) 我常常在用各類Timer, 還沒見過這種現象, 不過我覺得這不太可能是Forms.Timer的Bug, 因為如果有這種Bug, 早就被罵到臭頭了.

     


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。
    2011年3月21日 下午 03:22
    版主

所有回覆

  • 無法重現您形容的情形,一直會無限循環,倒數秒數設多少?網址共有幾個?要把專案壓縮,上傳到網路空間如SkyDrive嗎...
    2011年3月21日 上午 06:40
  • 我查到了

    控件沒有AutoReset這個

    可是我就是要用

    因為我還要把時間顯示出來到text.box1裡面去

    檔案在這邊

    http://jmnwea.blu.livefilestore.com/y1pTmw5HYE_KmuJoeMlMT8u8zyssdvK0PFRpGcf_d_2D8APUhrhrc3fPXu8n2_FAKmmLIW6dhuZv_-Nwn16Ove1OOCvXNXlZ5_L/traffic.rar?download&psid=1

    幫個忙

    謝謝

    我就是在NumericUpDown1時間先設好

    在匯入網址

    按下開始

    到計時只能用3次

    就不會到計時了

    2011年3月21日 上午 07:22
  • 請把我那網址列表改有效網址因為有效網址才會出現問題
    2011年3月21日 上午 07:27
  • 而且我在看好像是WebBrowser這個部分了

    在顯示當中如果資源很重

    秒數會停止

    2011年3月21日 上午 07:36
  • 可能是Timer沒把事情做完, 下一個Tick就來了. 然後又把Timer.enabled變成false, 於是程序可能永遠沒跑完就被強制結束了.

    先把Interval 拉長一點觀察看看.

     

     


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。
    2011年3月21日 下午 02:41
    版主
  •     Private Sub startlist()
        outTime = NumericUpDown1.Value
        For i As Integer = 0 To ListBox1.Items.Count - 1
          Me.Text = "目前被開啟網址 " & i + 1 & " & 網址總數 " & ListBox1.Items.Count
          ListBox1.SelectedIndex = i
          Dim url As String = ListBox1.Items(i).ToString()
          'start(url)
          System.Diagnostics.Process.Start("Iexplore.exe", url)
                Timer1.Enabled = True
                Timer1.Start() Next End Sub

     我直接開IE也是一樣耶

    所以不是Interval這裡拉長的問題了

    因為我是了很多次用IE

    跑了一段時間 到計時又不跑了

    是不是timer控件有個BUG在

    這個控件用一段時間好像是當了樣子

    我在用偵錯模式都沒有出現錯誤訊息

    真的太怪了

    2011年3月21日 下午 02:52
  • Private Sub Timer1_Tick_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        outTime -= 1
        TextBox1.Text = outTime
        If outTime = 0 Then
          Timer1.Enabled = False
          'disconnection()
          TbClear()
          Me.Button1_Click(sender, e)
        End If
      End Sub

     

    上面粗體字的部份讓我有一個很大的疑問:

    (1) 你怎不直接呼叫   startlist() 就好了 ?

    (2) 你這樣的寫法很奇特, 因為這時你傳給Button1 Click 事件委派函式的引數全都是錯的. 你如果非得這樣click 一下 Button1不可, 改用 Button.PerformClick 方法 去做

    (3) 我不知道你有沒有先試過把Interval拉長看看就下了你在上文的結論 ? 因為如果你不試, 我也無從判斷起這個可能原因是不是對的, 另一個可能性是因為 Windows.Forms.Timer 和 UI 使用同一個訊息迴圈, 也有可能是因為資源使用量太大導致訊息迴圈停住了. (你可試著用System.Timers.Timer 或 Threading.Timer 去取代Forms.Timer看看)

    (4) 我常常在用各類Timer, 還沒見過這種現象, 不過我覺得這不太可能是Forms.Timer的Bug, 因為如果有這種Bug, 早就被罵到臭頭了.

     


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。
    2011年3月21日 下午 03:22
    版主
  • 試試看把 TIMER1 改 BackgroundWorker 去跑看看

    比較不會卡在那邊


    0.0
    2011年3月21日 下午 03:22
  • 回覆版主:

    (1) 你怎不直接呼叫   startlist() 就好了 ?

    答:這邊我有做修正了,直接改startlist() 了。

    (2) 你這樣的寫法很奇特, 因為這時你傳給Button1 Click 事件委派函式的引數全都是錯的. 你如果非得這樣click 一下 Button1不可, 改用 Button.PerformClick 方法 去做

    答:這個方式我又吸收一個了,可是我不用了按鈕。

    (3) 我不知道你有沒有先試過把Interval拉長看看就下了你在上文的結論 ? 因為如果你不試, 我也無從判斷起這個可能原因是不是對的, 另一個可能性是因為 Windows.Forms.Timer 和 UI 使用同一個訊息迴圈, 也有可能是因為資源使用量太大導致訊息迴圈停住了. (你可試著用System.Timers.Timer 或 Threading.Timer 去取代Forms.Timer看看)

    答:這邊我改成5000了,跑了一段時間還是一樣。

    (4) 我常常在用各類Timer, 還沒見過這種現象, 不過我覺得這不太可能是Forms.Timer的Bug, 因為如果有這種Bug, 早就被罵到臭頭了.

    答:我也是第一次碰到,照理說不會停的。

    回覆.NET愛好者

    BackgroundWorker這個我沒套入時間計時過,因為我不太會寫,找文中,看看有沒範例了。

    2011年3月21日 下午 04:04

  • (3) 我不知道你有沒有先試過把Interval拉長看看就下了你在上文的結論 ? 因為如果你不試, 我也無從判斷起這個可能原因是不是對的, 另一個可能性是因為 Windows.Forms.Timer 和 UI 使用同一個訊息迴圈, 也有可能是因為資源使用量太大導致訊息迴圈停住了. (你可試著用System.Timers.Timer 或 Threading.Timer 去取代Forms.Timer看看)

    答:這邊我改成5000了,跑了一段時間還是一樣。


    你改了之後的Timer Tick 次數有變多嗎 ? 例如在 Interval在 1000, 5000, 10000 的狀況下, 各別Timer Tick次數為多少 ?

    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。
    2011年3月21日 下午 04:13
    版主
  • 又怪怪的
    我看到他跑時候一段時間停止不循環後
    我沒關閉程式 讓程式開著
    一段時間我在看 又開始到計時了
    還是資源吃太重關西 需要釋放的什麼
    gc我也有用不過沒用 還是會這樣

    我剛剛爬爬文找到Threading.Timer範例

    不過要怎麼套到textbox顯示到計時秒數在倒數呢

        Private Sub Button6_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button6.Click
            Dim t As New System.Timers.Timer(6000) '实例化Timer类,设置间隔时间为10000毫秒;
            AddHandler t.Elapsed, New System.Timers.ElapsedEventHandler(AddressOf theout) '到达时间的时候执行事件;
            t.AutoReset = False '设置是执行一次(false)还是一直执行(true);
            t.Enabled = True '是否执行System.Timers.Timer.Elapsed事件;
        End Sub

        Public Sub theout(ByVal source As Object, ByVal e As System.Timers.ElapsedEventArgs)
            MessageBox.Show("OK!")
        End Sub

    2011年3月21日 下午 04:36
  • 又怪怪的
    我看到他跑時候一段時間停止不循環後
    我沒關閉程式 讓程式開著
    一段時間我在看 又開始到計時了
    還是資源吃太重關西 需要釋放的什麼
    gc我也有用不過沒用 還是會這樣

    我剛剛爬爬文找到Threading.Timer範例

    不過要怎麼套到textbox顯示到計時秒數在倒數呢

        Private Sub Button6_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button6.Click
            Dim t As New System.Timers.Timer(6000) '实例化Timer类,设置间隔时间为10000毫秒;
            AddHandler t.Elapsed, New System.Timers.ElapsedEventHandler(AddressOf theout) '到达时间的时候执行事件;
            t.AutoReset = False '设置是执行一次(false)还是一直执行(true);
            t.Enabled = True '是否执行System.Timers.Timer.Elapsed事件;
        End Sub

        Public Sub theout(ByVal source As Object, ByVal e As System.Timers.ElapsedEventArgs)
            MessageBox.Show("OK!")
        End Sub

    這是Timers.Timer吧 ?

    Timers.Timer: 三種時間人《.NET中的Timer(2)》

    Threading.Timer:三種時間人《.NET中的Timer(3)》

     


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。
    2011年3月21日 下午 04:58
    版主