-2

我有这个类,我有一个循环从同一个类启动多个线程。这一切都是从主窗体完成的。

现在我想从这些类中更新 main 上的richtextbox。

我已经尝试了那些 begininvokes 等,但没有任何效果,没有错误但也没有输出。

这里是启动线程的代码:

        Private PingObjects(100000) As Account 'Account is the class and login is the sub in it...
        PingObjects(I) = New Account
        Threads(I) = New Threading.Thread(AddressOf PingObjects(I).login)
        Threads(I).IsBackground = True
        Threads(I).Start()

为了更新 rtb,我使用 MainForm.log.text = "....." 没有任何反应,没有错误。我也尝试过使用开始调用程序方法。

4

2 回答 2

1

当然,
应该使用 Control.Invoke() 从不同于主 UI 线程的线程更新控件。
我整理了一些东西让你试试

' at the form level
Private Delegate Sub UpdateRTB(ByVal Msg As String)

' your thread function
Private Sub Login()
    Dim Data As String = "your message for the RTB"
    rtb.Invoke(New UpdateRTB(AddressOf MainForm.UpdateRTBMessage), Data)
End Sub

' the UI updater.
Private Sub UpdateRTBMessage(ByVal msg as String)
    rtb.Text = msg
End Sub

我在这里假设您的 RichTextBox 被命名为 rtb

于 2012-05-31T12:00:19.437 回答
0

找到了解决方案!

我在另一个论坛学分上找到了解决方案: facebookdoom on HF

Delegate Sub AppenLogDelegate(ByVal update As String)
Public Sub AppendLog(ByVal update As String) Implements Interface1.AppendLog
    If log.InvokeRequired Then
        log.Invoke(New AppenLogDelegate(AddressOf AppendLog), update)
    Else
        log.AppendText(update & vbCrLf)
    End If
End Sub

在主窗体中

制作新的接口类:-

公共接口 Interface1 Sub AppendLog(ByVal update As String) 结束接口

把它放在线程类中:

Private ReadOnly _form As Interface1

Public Sub New(ByVal form As Form) _form = form End Sub

用法 :-

_form.AppendLog("aaaaaa")

于 2012-06-01T14:25:05.750 回答