6

我一直試圖瞭解這幾天,現在想知道這是簡單的東西,我失蹤或完全錯誤。VB.NET多線程。在一個單獨的類文件中從一個類的UI控件調用

實施例: 兩個文件 - TestClass.vb,myForm.vb


TestClass.vb看起來如下:

Imports System.Threading 

Public Class TestClass 
    Private myClassThread As New Thread(AddressOf StartMyClassThread) 

    Public Sub Start() 
     myClassThread.Start() 
    End Sub 

    Private Sub StartMyClassThread() 
     myForm.Msg("Testing Message") 
    End Sub 
End Class 

myForm.vb是一個基本的形式與列表框控件和一個名爲Output和StartButton的按鈕控件。 形式背後的代碼如下:

Public Class myForm 
    Private classEntity As New TestClass 

    Private Sub StartButton_Click(ByVal sender As System.Object, _ 
            ByVal e As System.EventArgs) _ 
           Handles StartButton.Click 
     Msg("Start Button Pressed") 
     classEntity.Start() 
    End Sub 

    Delegate Sub MsgCallBack(ByVal mesg As String) 

    Public Sub Msg(ByVal mesg As String) 
     If Output.InvokeRequired Then 
      MsgBox("Invoked") 
      Dim d As New MsgCallBack(AddressOf Msg) 
      Invoke(d, New Object() {mesg}) 
     Else 
      MsgBox("Not Invoked") 
      mesg.Trim() 
      Output.Items.Add(mesg) 
     End If 
    End Sub 
End Class 

其結果是:

應用程序運行,沒有錯誤或異常。 顯示的是列表框和開始按鈕。 我按下開始按鈕,msgbox按預期方式顯示「Not Invoked」,並在點擊OK後將msgbox「Start Button Pressed」添加到Output列表框控件中。 緊隨其後msgbox再次彈出並顯示「未被調用」。我期待「調用」作爲一個單獨的線程試圖使用輸出列表框控件。 當然,這會導致Output.Items.Add被嘗試,導致沒有可見的結果,因爲線程不被允許直接更新UI控件。

我一定讀過一本價值不同的小書,試圖徹底理解坑坑窪窪和方法,但我覺得我可能陷入了很多人可能會陷入的陷阱。 以我目前的理解和知識,我無法擺脫困境,並希望得到任何意見和建議。

親切的問候,

萊克斯

回答

3

這裏的問題是,你調用的函數Msg不是myForm的實例,但作爲類myForm會的共享功能。

更改代碼TestClass添加

Public FormInstance as myForm 

,然後更換

myForm.Msg("Testing Message") 

FormInstance.Msg("Testing Message") 

然後在StartButton_Click添加一行

classEntity.FormInstance = Me 

你會得到預期的結果。

+0

Soumya92 - 完美!非常感謝你。只要信譽允許,我就會'投票'。 – Lecronox 2011-05-21 10:20:40

相關問題