2015-06-12 59 views
-1

互聯網上有很多關於線程的頁面,但是我似乎無法控制它。線程問題(我不明白)

我有一個窗體,點擊一個按鈕,循環瀏覽一個文件並逐行讀取它。每行是不同FTP站點的登錄詳細信息。

當它讀取一行時,它將使用登錄詳細信息將一個變量Dim作爲名爲CallFTP的類的新實例。

然後使用名爲PerformFTP的CallFTP中的函數將Dim變量作爲新線程Dim。

PerformFTP返回一個字符串與FTP的結果,我想將它添加到窗體上的一個ListBox開始它的一切。

該按鈕的代碼是這樣......

Private Sub cmdRun_Click(sender As Object, e As EventArgs) Handles cmdRun.Click 
    For Each _FTPLine As String In Split(_FTPDetails, vbNewLine) 
     Dim _Active As Boolean = CBool(Split(_FTPLine, "|")(7)) 

     If _Active Then 
      _CurNum += 1 
      _ID = Format(Now.Year, "0000") & Format(Now.Month, "00") & Format(Now.Day, "00") & Format(Now.Hour, "00") & Format(Now.Minute, "00") & Format(Now.Second, "00") & Format(Now.Millisecond, "000") & Format(_CurNum, "00000") 

      Dim _FTP As New CallFTP(_ID, Split(_FTPLine, "|")(0), Split(_FTPLine, "|")(1), Split(_FTPLine, "|")(2), Split(_FTPLine, "|")(3), Split(_FTPLine, "|")(4), Split(_FTPLine, "|")(5), Split(_FTPLine, "|")(6)) 
      Dim _Thread = New Thread(New ThreadStart(AddressOf _FTP.PerformFTP)) 

      With _Thread 
       .IsBackground = True 
       .Start() 
      End With 
     End If 
    Next _FTPLine 
End Sub 

類是如下(不完全,但你並不需要的代碼的其餘部分笑)

Public Class CallFTP 
    Private _ID As String = "" 
    Private _Response As String = "" 
    Private _IPAddress As String = "" 
    Private _Port As String = "" 
    Private _User As String = "" 
    Private _Pass As String = "" 
    Private _Remote As String = "" 
    Private _Local As String = "" 
    Private _InOut As String = "" 

    Public Sub New(ID As String, Server As String, PortNum As String, Username As String, Password As String, RemoteDir As String, LocalDir As String, InOrOut As String) 
     _ID = ID 
     _IPAddress = Server 
     _Port = PortNum 
     _User = Username 
     _Pass = Password 
     _Remote = RemoteDir 
     _Local = LocalDir 
     _InOut = InOrOut 
    End Sub 

    Public Function PerformFTP() As String 
     Return "This is a test" 
    End Function 
End Class 

任何人都可以解釋我將如何調用一個名爲modMisc的模塊(它向主窗體上的ListBox添加一個字符串)上的子命名LogMessage?

我讀過,你需要調用它,但是我讀的所有東西似乎都讓我頭痛,讓我需要躺在黑暗的房間裏幾個小時。

任何人都可以解釋,就好像你正在說2歲? :)

任何幫助將不勝感激。

+1

2歲的不要編程,幾乎不說話,你確定你想要那個對話框嗎? – OneFineDay

+0

好吧,也許有點老。 Haha –

+0

http://stackoverflow.com/q/8986810/1070452只是「RELATED」下列出的10個建議問題之一。雖然我沒有檢查「講話」級別。線程似乎有點多,順便說一句。 – Plutonix

回答

0

如果要從其創建位置的另一個線程更新它,則需要調用委託來更新GUI。

1º你的委託必須匹配(具有相同的簽名),比方法,你將使用:

Delegate Sub LogMessageExampleDelegate(ByVal x As Integer, ...) 

簽名是指委託必須返回並接收相同類型的比你的函數/方法。

2º使用委託調用您的函數來更新GUI。例如,這您的更新界面函數中:

If yourListBox.InvokeRequired Then 
    yourListBox.Invoke(New LogMessageExampleDelegate(AddressOf THE_FUNCTION_WHICH_UPDATES_THE_GUI_NAME), parameter_value) 
Else 
    'Just call your function 
End If 

利用,爲例如:

sub addToListBox(byval text as string) 
    myListBox.Items.add(text) 
end sub 

所以你的調用將是:

If yourListBox.InvokeRequired Then 
    yourListBox.Invoke(New LogMessageExampleDelegate(AddressOf addToListBox), "Item 1") 
Else 
    'Just call your function 
    addToListBox("Item 1") 
End If 

PS:我寫了這麼希望的兩倍我沒有注意到它,卻沒有搞砸。

+0

感謝您的解釋,但我在哪裏調用它?它是在按鈕單擊事件,類中的新事件還是PerformFTP事件? –

+0

在獲取控件文本後,使用委託,就在你要做的地方。如果我不想誤解它的話,那會發生在你的線程中。 –

+0

對不起,我還沒有得到它。用我上面的例子,我會在哪裏調用? 我嘗試將它添加到PerformFTP,但它沒有做任何事情。如果我將它添加到cmdRun_Click,我如何獲得PerformFTP的結果? –