Доступ к свойствам формы Form1 из потока - PullRequest
0 голосов
/ 26 сентября 2011

У меня есть функция обработчика исключений, которая в основном просто записывает строку в текстовое поле в Form1. Это нормально работает при нормальной работе, но во-вторых, я использую поток, чтобы запустить процесс, он не может получить доступ к свойству. Не выдается исключение, но текст не записывается в текстовое поле:

Public Sub ExceptionHandler(ByVal Description As String, Optional ByVal Message As String = Nothing)
    ' Add Error To Textbox
    If Message = Nothing Then
        Form1.txtErrLog.Text += Description & vbCrLf
        Log_Error(Description)
    Else
        Form1.txtErrLog.Text += Description & " - " & Message & vbCrLf
        Log_Error(Description, Message)
    End If
    MessageBox.Show("caught")
End Sub

Можно ли получить доступ к свойствам формы из потока таким образом, или было бы проще записать в текстовый файл или аналогичный файл и обновлять свойства текстового поля каждые 10 секунд или около того (не считаю это хорошим вариантом, но если это единственный способ, которым придется это делать!).

Кроме того, все еще новичок в VB, поэтому, если я сделал что-то, что не является хорошей практикой, пожалуйста, дайте мне знать!

Ответы [ 2 ]

2 голосов
/ 26 сентября 2011

Нет, вы не должны обращаться к каким-либо свойствам компонента GUI из «неправильного» потока (т. Е. Из любого потока, отличного от того, в котором запущен насос событий этого компонента).Вы можете использовать Control.Invoke / BeginInvoke для выполнения делегата в нужном потоке.

В Интернете существует множество учебных пособий - многиебудут написаны с примерами на C #, но основная информация не зависит от языка.См., Например, учебник Джо Албахари по созданию потоков .

1 голос
/ 26 сентября 2011

Вы должны использовать делегатов. Поиск делегатов в VB.

Здесь мир кода, который делает работу.

 Delegate Sub SetTextCallback(ByVal text As String)

Public Sub display_message (ByVal tx As String)

'prüfen ob invoke nötig ist Если Me.RichTextBox1.InvokeRequired То Dim d As New SetTextCallback (AddressOf display_message) Me.Invoke (д, время) еще tx.Trim () Me.RichTextBox1.Text = tx Конец, если

End Sub
...