none
多執行緒讓畫面 Lag 的問題 RRS feed

  • 問題

  • 原程式中會用到Timer(做複雜計算和更新UI上的值)和網路的收發執行緒,執行起來都畫面會lag,一托動就會有殘影或感覺不會動了;
    我寫一個小測試程式,只是單純的做加法動作沒做其它更複雜的動作就有Lag 的現像發生,
    1個Timer再加一個 Thread還能動,再加一個的話就完蛋,請問這該如何處理會比較恰當,謝謝。
    Imports System.Threading
    Public Class Form1
        Private count As Integer = 0
        Private value As Integer = 0
        Private value2 As Double = 0
        Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
            TextBox1.Text = count.ToString()
            count += 1
            Timer1.Interval = 1
        End Sub
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            'Timer1.Start()
            Dim thread As Thread
            thread = New Thread((AddressOf MainThread))
            thread.Start()
            'ThreadPool.QueueUserWorkItem(New WaitCallback(AddressOf MainThread2))
            Dim thread2 As Thread
            thread2 = New Thread((AddressOf MainThread2))
            thread2.Start()
        End Sub

        Private Sub MainThread()
            Try
                While (True)
                    Me.Invoke(New DelegateTestCode(AddressOf setText), value.ToString)  '將資料顯示
                    value += 1
                End While
            Catch se As Exception
            End Try
        End Sub
        Private Sub MainThread2()
            While (True)
                Me.Invoke(New DelegateTestCode2(AddressOf setText2), value2.ToString)  '將資料顯示
                'Console.WriteLine(value2.ToString)
                value2 += 1
            End While
        End Sub
        Private Delegate Sub DelegateTestCode(ByVal s As String)
        Private Delegate Sub DelegateTestCode2(ByVal s As String)
        Private Sub setText(ByVal str As String)
            TextBox2.Text = str
        End Sub
        Private Sub setText2(ByVal str As String)
            TextBox3.Text = str
        End Sub
    End Class

    2009年10月16日 上午 07:34

解答

所有回覆

  • 我的問題是, 為什麼要用Timer + Thread ?
    不能全用Thread或全用Timer嗎 ?
    '===補充======
    而且我發現你的Timer Interval是1, Timer是不可能做到這麼快的...
    不如用Thread中使用While 或 Loop迴圈來做

    學而不思則罔, 思而不學則殆.
    如果你一直都看不懂、不想學習看懂、抗拒看懂MSDN Library的話,那你最好放棄想要寫好程式這件事
    2009年10月16日 上午 07:46
    版主
  • timer 跟 while 迴圈用掉太多cpu資源
    即使再怎麼簡單的運算,放在while(true)裡面都一樣會造成cpu high吧




    • 已編輯 阿尼 2009年10月16日 上午 08:49
    2009年10月16日 上午 08:06
  • 定時要呼叫 Sleep
    例如這篇寫的:http://tlcheng.spaces.live.com/blog/cns!145419920BFD55A7!1640.entry


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    • 已標示為解答 Lolota Lee 2009年10月23日 上午 06:35
    2009年10月16日 上午 08:16
  • timer + Thread = = 這個我也不是很願意使用的;Timer 是原程式作者用來計算複雜程式用的,在「希望」不動到他原程式情況下,
    額外加入其它的 Thread(監聽另一個AP 從網路傳資來資料 while(true)) 來接收其它的資料,再傳到 Timer 中來進行計算 ,
    至於Timer Interval是1, 這個我只是模擬而最快的情況,實際是設1000 ~

    上面程式把Timer關了,用MainThread1 and MainThread2 ,也開啟 Me.Invoke來把值輸出,好想效果也沒比較好 (不能動吧!)
    持續做同件事,用Timer外就是用 Thread (while (true)),還是有其它的法好子?

    Application.DoEvents() ;System.Threading.Thread.Sleep(dwMilliseconds)  這個我有在程式中加入,只是感覺沒啥差似的 = = ,跑久一點也會掛點的感覺出現,
    也許是我加的時機點不好吧!?正常情況下,是加在那比較恰當? 複雜計算式的過程中每一個區段中就設一個??

    2009年10月16日 下午 03:16
  • 如果你的 Timer 是 1 秒跑一次,那麼在你的 While ~ End While 內加上 Sleep(1000)
    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2009年10月16日 下午 03:28

  • 放慢速度,且睡一下,方法可以用~~

    http://msdn.microsoft.com/zh-tw/library/yy12yx1f.aspx  = = 我一開始應該要參考這篇的作法的~~
    2009年10月27日 上午 09:10