我有一个exceptionhandler函数,基本上只是将一行写入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来说还是新手,所以如果我做了一些不好的做法,请告诉我!
答案 0 :(得分:2)
不,您不应该从“错误”线程(即运行该组件的事件泵的线程以外的任何线程)访问任何GUI组件属性。您可以使用Control.Invoke
/ BeginInvoke
在正确的线程上执行委托。
网上有很多这方面的教程 - 很多都是用C#中的例子编写的,但底层信息与语言无关。例如,请参阅Joe Albahari's threading tutorial。
答案 1 :(得分:1)
你必须使用代表。在VB中搜索代表。
这是完成工作的代码的和平。
Delegate Sub SetTextCallback(ByVal text As String)
Public Sub display_message(ByVal tx As String)
'prüfenob援引nötigist 如果Me.RichTextBox1.InvokeRequired那么 Dim d As New SetTextCallback(AddressOf display_message) Me.Invoke(d,tx) 其他 tx.Trim() Me.RichTextBox1.Text = tx 结束如果
End Sub