2011-09-26 60 views
0

我有一个exceptionhandler函数,基本上只是将一行写入Form1上的文本框。这在正常运行时工作正常,但第二次我使用线程来启动一个进程,它无法访问该属性。不会抛出异常,但没有文本会被写入文本框:从线程访问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

不,您不应该从“错误”线程(即运行该组件事件泵的线程以外的任何线程)访问任何GUI组件属性。您可以使用Control.Invoke/BeginInvoke在正确的线程上执行委托。

网上有很多关于这方面的教程 - 许多将用C#中的例子编写,但底层信息是与语言无关的。例如,请参阅Joe Albahari's threading tutorial

1

你必须使用代表。在VB中搜索代表。

这里的代码和平的工作。

Delegate Sub SetTextCallback(ByVal text As String) 

公用Sub display_message(BYVAL TX作为字符串)

“prüfenOB调用nötigIST 如果Me.RichTextBox1.InvokeRequired然后 昏暗d作为新SetTextCallback(AddressOf display_message) Me.Invoke(d ,TX) 否则 tx.Trim() Me.RichTextBox1.Text = TX 结束如果

End Sub