-2

このクラスがあり、同じクラスから複数のスレッドを起動するループがあります。これはすべてメインフォームから行います。

これらのクラスからメインのリッチテキストボックスを更新したいと思います。

私はこれらの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 = "....." を使用しています 何も起こらず、エラーもありません。begin invoker メソッドも使用してみました。

4

2 に答える 2

1

確かに
、メイン UI スレッドとは異なるスレッドからコントロールを更新するには、Control.Invoke() を使用する必要があります。
試してみたいものをまとめてみました

' 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

解決策を見つけました!!

別のフォーラムのクレジットで解決策を見つけました:HFのfacebookdoom

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

メインフォームで

新しいインターフェイス クラスを作成します:-

Public Interface Interface1 Sub AppendLog(ByVal update As String) End Interface

これをスレッドクラスに入れます:

Private ReadOnly _form を Interface1 として

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

使用法 :-

_form.AppendLog("aaaaaa")

于 2012-06-01T14:25:05.750 に答える