none
system.threading.timer 更新 UI 不成功 RRS feed

  • 問題

  • 不知何解, 一到  form1.Invoke(dpText, "現在是 " & amPM(hh) & " !") 就當掉, 說: "視窗控制代碼建立後才能呼叫控制項上的 Invoke 或 BeginInvoke"

     

    Class LetStart
        Public form1 As Form1   
        Private timerCallBack As TimerCallback   
        Public timerWakeUp As Timer
        private hh as integer 

        Sub New()
            form1 = New Form1()
            form1.hide()       
            timerCallBack = New TimerCallback(AddressOf Me.myCount)
            timerWakeUp = New Timer(timerCallBack, Nothing, TimeSpan.FromSeconds(0), TimeSpan.FromSeconds(1))       
        End Sub

        Public Sub myCount(ByVal state As Object)
            hh = Date.Now.Hour            
                form1.Invoke(dpText, New Object(){"現在是 " & amPM(hh) & " !"})
                form1.Invoke(fmLocate)   
                form1.Invoke(fmShow)
           
        End Sub

    function amPM(hh as integer) as string
    dim ap as string = "am"
    if hh > 12 then
    hh = hh - 12
    ap = "pm"
    end if
    return hh.toString() & ap
    end function


        Delegate Sub LabelTextDelegate(ByVal tx As String)
        Private dpText As New LabelTextDelegate(AddressOf displayText)

        Sub displayText(ByVal tx As String)
            form1.Label1.Text = tx
        End Sub

        Delegate Sub formLocateDelegate()
        Private fmLocate As New formLocateDelegate(AddressOf formLocate)
        Sub formLocate()
            form1.Left = (Screen.PrimaryScreen.WorkingArea.Width - form1.Width) / 2
            form1.Top = (Screen.PrimaryScreen.WorkingArea.Height - form1.Height) / 2
        End Sub

        Delegate Sub formShowDelegate()
        Private fmShow As New formLocateDelegate(AddressOf formShow)
        Sub formShow()
            form1.Show()
        End Sub
    End Class

    2011年11月11日 上午 07:42

解答

  • 那你有注意到 你的程式中 缺少了 InvokeRequired 這東西嗎?

    至於 Form1的問題請參考 My.Forms

     


    以下為簽名檔,如果你愛拉椅子坐那就是你的問題。
    先查MSDN文件庫
    再用GOOGLE搜尋
    才到論壇來發問

    這是論壇不是技術支援中心
    沒有人得無償解答你的問題

    在標題或文章註明很急
    不會增加網友回覆速度
    2011年11月11日 下午 05:09
  • Hi,

    回到問題本質~

    當介面沒顯示時~更新介面上的資料~是否是不必要的資源耗費呢?!

    而且Timer也太頻繁了~UI的控制又必須要帶回主執行緒~這樣光轉換執行緒就很吃資源了

    若您的需求真的有此必要~可考慮用SynchronizationContext達到類似的效果


    謙卑學習,持之以恆,才能不斷的Level Up http://www.dotblogs.com.tw/larrynung/
    2011年11月11日 下午 05:22
  • FAQ

    http://social.msdn.microsoft.com/Search/zh-TW/?Refinement=112&query=MultiThread%20232


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2011年11月15日 下午 03:17

所有回覆

  • 您可以檢查一下form1這個變數是否有值? 如果沒有值, 就是造成沒有視窗控制代碼的原因
    2011年11月11日 下午 02:20
  •         If form1 IsNot Nothing Then
                MessageBox.Show(form1.Name)
            End If

    成功顯示為 form1, 所以應該不是 null。如果我在 New() 內加上 form1.show(), timer 可以 update UI 的內容, 但我不想在 New() 階段用 form1.show(), 最大問題是我找不到為何加 form1.show() 卻可正常運作的原因

     

     

    2011年11月11日 下午 02:48
  • 不知道 為什麼你只是要顯示一個 12小時制的小時 需要用到 Thread.Timer

    不過 你的問題點出在 跨執行緒

    建議你參考Bill叔關於Timer的三篇文

    三種時間人《.NET中的Timer(1)》

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

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


    以下為簽名檔,如果你愛拉椅子坐那就是你的問題。
    先查MSDN文件庫
    再用GOOGLE搜尋
    才到論壇來發問

    這是論壇不是技術支援中心
    沒有人得無償解答你的問題

    在標題或文章註明很急
    不會增加網友回覆速度
    2011年11月11日 下午 03:52
  • 超過 1 小時以上的,我都會改用 Windows 內建的排程來跑,來省記憶體。
    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2011年11月11日 下午 04:28
  • am pm 只是用作道出我問題所在。3 篇文章看過了, 但找不著解決方法。想請問一下, vb 的 Form1 (Class), 是不是不用 new 一個實體也可使用? 因為我試過沒 dim form1 = new Form1 也可直接用 Form1.show, Form1.Label1.Text 操作 [我已在 main() 內的 application.run(new Form1) 改為 application.run() ]
    2011年11月11日 下午 04:29
  • 那你有注意到 你的程式中 缺少了 InvokeRequired 這東西嗎?

    至於 Form1的問題請參考 My.Forms

     


    以下為簽名檔,如果你愛拉椅子坐那就是你的問題。
    先查MSDN文件庫
    再用GOOGLE搜尋
    才到論壇來發問

    這是論壇不是技術支援中心
    沒有人得無償解答你的問題

    在標題或文章註明很急
    不會增加網友回覆速度
    2011年11月11日 下午 05:09
  • Hi,

    回到問題本質~

    當介面沒顯示時~更新介面上的資料~是否是不必要的資源耗費呢?!

    而且Timer也太頻繁了~UI的控制又必須要帶回主執行緒~這樣光轉換執行緒就很吃資源了

    若您的需求真的有此必要~可考慮用SynchronizationContext達到類似的效果


    謙卑學習,持之以恆,才能不斷的Level Up http://www.dotblogs.com.tw/larrynung/
    2011年11月11日 下午 05:22
  • am pm 只是用作道出我問題所在。3 篇文章看過了, 但找不著解決方法。想請問一下, vb 的 Form1 (Class), 是不是不用 new 一個實體也可使用? 因為我試過沒 dim form1 = new Form1 也可直接用 Form1.show, Form1.Label1.Text 操作 [我已在 main() 內的 application.run(new Form1) 改為 application.run() ]

    這就是Visual Basic 自2005版以後因為方便而令人會迷惑的地方. 沒有實體怎麼可能可以操作 ?
    2011年11月13日 上午 09:30
  • VB2005 線上手冊有寫。

    為了讓 VB6 的開發者更順手,VBNET 自 VB2005 以後,恢復 VB6 內建的隱含宣告 Form 的功能。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2011年11月13日 上午 11:48
  • 那你有注意到 你的程式中 缺少了 InvokeRequired 這東西嗎?

    至於 Form1的問題請參考 My.Forms

    己試過, 但有什麼關係?  InvokeRequired 只是判斷 update UI 是否在同一執行緒上, 我的 code 是這樣的, 不知有否理解錯誤?

    執行結果是可以彈出 form1, 但所有控件繪製失敗, 像是當了機似的

        Public Sub myCount(ByVal state As Object)
            hh = Date.Now.Hour  

    If  form1.InvokeRequired Then    
                form1.Invoke(dpText, New Object(){"現在是 " & amPM(hh) & " !"})
                form1.Invoke(fmLocate)   
                form1.Invoke(fmShow)

    Else

    form1.Label1 = "現在是 " & amPM(hh) & " !"

    formLocate()

    form1.show()

    End If
            
        End Sub

     

    2011年11月13日 下午 03:59
  • 如果你覺得沒關係  你可以不要加

    還有 如果你對多執行緒的觀念不熟

    先把它搞懂 再來寫多執行緒的程式

    因為他和你想的不一樣


    以下為簽名檔,如果你愛拉椅子坐那就是你的問題。
    先查MSDN文件庫
    再用GOOGLE搜尋
    才到論壇來發問

    這是論壇不是技術支援中心
    沒有人得無償解答你的問題

    在標題或文章註明很急
    不會增加網友回覆速度
    2011年11月13日 下午 05:23
  • If form1 IsNot Nothing Then
                MessageBox.Show(form1.Name)
    End If

    這樣的動作只能判斷form1物件有沒有內容而已, 要判斷form1有沒有視窗控制代碼, 程式要這樣寫

    If form1 IsNot Nothing Then
                MessageBox.Show(form1.Handle)
    End If

    通常視窗代碼要在Form顯示後才會取得, 也就是form1.Show呼叫之後

     

    2011年11月15日 上午 02:38
  • 原來是這樣, 但要動態地在多執行緒下創建視窗, 應該要怎樣做呢?

    label.text 已成功用 delegate 的方法做到, 但就要一開始就要 form1.show, 然後交由 timer 在別的執行緒下改 label.text, 而我不想一開始便 form1.show。 我要在 timer 的執行緒內做到 form1.show, 要怎麼辦呢? 

    2011年11月15日 下午 02:55
  • FAQ

    http://social.msdn.microsoft.com/Search/zh-TW/?Refinement=112&query=MultiThread%20232


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2011年11月15日 下午 03:17