none
使用 System.Timers.Timer 更新TrackBar時 UI發生跨執行緒的錯誤 RRS feed

  • 問題

  • 我的問題如標題  小弟在設計用System.Timers.Timer  這個計時器

    去累加 TrackBar1的位置 結果卻跑出跨執行緒的錯誤

    我上網查了些資訊 好似說要用委派及將更新的form類別丟進去這些資訊

    我參考了網路上的資訊 寫了些代碼 但還是出現跨執行緒錯誤

    應該是我的委派的代碼好像寫得有點問題 請各位大大指導一下

    這邊該怎麼寫才對

    Private newtime As New System.Timers.Timer
        Private Sub Button3_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
    
            'If Timer4.Enabled = False Then
            '    Me.Timer4.Start()
            'End If
            '==============System.Timers.Timer
            AddHandler newtime.Elapsed, AddressOf Timers_Timer_Elapsed
            newtime.Interval = 20
            newtime.Start()
            '==============
        End Sub
    
        Sub Timers_Timer_Elapsed()
            Me.newtime.SynchronizingObject = Me
            Me.BeginInvoke(New UpdateControl(AddressOf _mUpdateControl), New Object() {TrackBar1})
    
            If Not TrackBar1.Value = TrackBar1.Maximum Then
                'Me.TrackBar1.Value += 1
    
                Me.BeginInvoke(New UpdateControl(AddressOf _mUpdateControl), New Object() {TrackBar1})
        
            Else
                TrackBar1.Value = 0
                newtime.Stop()
            End If
    
        End Sub
    
        Private Delegate Sub UpdateControl(ByVal Ctrl As TrackBar)
        Private _objLock As New Object()
        Private Sub _mUpdateControl(ByVal Ctrl As TrackBar)
            SyncLock Me._objLock
                If TypeOf Ctrl Is TrackBar Then
                    Ctrl.Value += 1
                End If
            End SyncLock
        End Sub

    出錯的圖片


    • 已編輯 向恩 2013年10月6日 下午 12:35
    2013年10月6日 下午 12:34

解答

  • System.Timers.Timer 的 Elpased 事件委派函式會在另一個執行緒執行.

    所以在此委派函式中更動 UI 控制項需透過跨執行緒委派

    (也就是關於 TrackBar1.Value 的存取 請使用跨執行緒委派)

    請參閱

    (1) 進行對 Windows Forms 控制項的安全執行緒呼叫

    (2) 論壇既有討論


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。 <br/> <a target="_blank" href="http://www.bplan.com.tw/chunfeng/front/bin/ptlist.phtml?Category=103591"><img border="0" src="http://files.dotblogs.com.tw/billchung/1007/20107414497912.gif" width="200" height="67"></a>



    2013年10月6日 下午 03:26
    版主

所有回覆

  • System.Timers.Timer 的 Elpased 事件委派函式會在另一個執行緒執行.

    所以在此委派函式中更動 UI 控制項需透過跨執行緒委派

    (也就是關於 TrackBar1.Value 的存取 請使用跨執行緒委派)

    請參閱

    (1) 進行對 Windows Forms 控制項的安全執行緒呼叫

    (2) 論壇既有討論


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。 <br/> <a target="_blank" href="http://www.bplan.com.tw/chunfeng/front/bin/ptlist.phtml?Category=103591"><img border="0" src="http://files.dotblogs.com.tw/billchung/1007/20107414497912.gif" width="200" height="67"></a>



    2013年10月6日 下午 03:26
    版主
  • Hi, 這問題解決了嗎 ?

    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。 <br/> <a target="_blank" href="http://www.bplan.com.tw/chunfeng/front/bin/ptlist.phtml?Category=103591"><img border="0" src="http://files.dotblogs.com.tw/billchung/1007/20107414497912.gif" width="200" height="67"></a>

    2013年10月11日 上午 06:04
    版主