2015-06-12 2 views
-1

В потоке много и много страниц, но, похоже, я не могу об этом подумать.Проблемы с потоками (я этого не понимаю)

У меня есть форма, которая одним нажатием кнопки проходит через файл и читает его по строкам. Каждая строка - это данные входа для разных FTP-сайтов.

Когда он читает строку, Dim представляет собой переменную как новый экземпляр класса с именем CallFTP, используя данные для входа.

Он затем представляет переменную Dim как новую тему, используя функцию в CallFTP с именем PerformFTP.

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 

Может ли кто-нибудь объяснить, как я назвал бы sub с именем LogMessage в модуле с именем modMisc (который добавляет строку в ListBox в основной форме)?

Я читал, что вам нужно вызвать его, но все, что я читаю, кажется, дает мне головную боль и заставляет меня лечь в темную комнату на несколько часов.

Может ли кто-нибудь объяснить, как будто вы разговариваете с 2-летним? :)

Любая помощь будет высоко оценена.

+1

2-х лет не программируют и почти не говорят, вы уверены, что хотите этот диалог? – OneFineDay

+0

Ну, может быть, немного старше. Haha –

+0

http://stackoverflow.com/q/8986810/1070452 только один из 10 предложенных вопросов, перечисленных справа в разделе «СВЯЗАННЫЕ». Я не проверял уровень «говорить». Поток кажется немного, BTW. – Plutonix

ответ

0

Вам необходимо вызвать делегата для обновления вашего графического интерфейса, если вы собираетесь обновить его из другого потока, который был создан.

1º Делегат должен соответствовать (имеет одинаковую сигнатуру), чем метод, который вы будете использовать:

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

Подписи означает, что делегат должен вернуть и получить те же тип, чем ваши функции/метода.

2º Вызов вашей функции для обновления GUI с помощью делегата. Это, например, внутри вашего обновления функции 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 

Так что ваш Invoke будет:

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? –

Смежные вопросы