【问题标题】:Update from from multiple threads of the same class从同一类的多个线程更新
【发布时间】:2012-05-31 11:38:47
【问题描述】:

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

现在我想从这些类更新 main 上的富文本框。

我已经尝试了这些 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 调用方法。

【问题讨论】:

  • 你能显示 PingObjects.Login 的代码吗? (顺便说一句,我真的希望你不打算同时启动100000个线程)
  • 我已经把它写在那里了 -.- 无论如何,再次: MainForm.log.text = "....." 。好吧,100000 只是我提出的一些数字.. 那些甚至可能不会推出 1 %.. 但这不是问题!
  • 您没有显示足够的代码。您的 PingObjects(I) 建议使用 for 循环,但您没有显示它。您说您使用了“begininvokes”,但没有显示。显然你的login() 方法的全部内容是MainForm.log.text = ".....",它不使用Control.Invoke(或BeginInvoke),因此不会更新你的UI。所以拜托,发布更多代码。
  • 这是目前唯一的代码,所以我只发布了它,我所说的调用是指那些在其他线程上发布在 stackoverflow 上并获得 10++ 票的代码。我假设你知道那个代码。下面的那个也不行。
  • 如果您尝试从后台线程修改控件,.NET 4 将引发异常。这意味着您要么吞噬异常,要么甚至不更新登录方法中的控件。您必须提供更多代码。

标签: .net vb.net multithreading richtextbox


【解决方案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

【讨论】:

  • 不,不工作:/我把它放在 Account.login() 中:Dim Data As String = "your message for the RTB" MainForm.log.Invoke(New UpdateRTB(AddressOf MainForm.UpdateRTBMessage) , 数据)并且在 mainform 中作为公共共享登录的功能也是公共共享的,所以..
  • @HooCraX - 详细说明“不工作”是否有错误?如果是这样,那是什么?为了让任何人提供帮助,我们需要更多信息
  • 我怀疑问题与 MainForm 变量有关。从@HooCraX cmets 看来,这是一个全局表单实例,可在VB.NET 中用于轻松从VB6 转换,它不是使用New 创建的变量。但是,我没有找到任何关于这与问题的关系的提示。
  • @Matt Wilko,我说了两次,没有错误但也没有输出。史蒂夫 VB6 呢?没办法,这是VB.NET,也许是公共共享私有共享的东西在那里做些什么? Richtextbox 从非线程子...(也从其他类)更新得很好。哦还有一件事我忘了提,我使用的是用户制作的主题,但只有普通的富文本框,如果这有什么不同的话......
【解决方案2】:

找到解决办法了!!

我在另一个论坛学分上找到了解决方案: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

在主窗体中

制作新的接口类:-

公共接口接口1 子 AppendLog(ByVal 更新为字符串) 结束接口

把它放在线程类中:

Private ReadOnly _form As Interface1

Public Sub New(ByVal form As Form) _form = 形式 结束子

用法:-

_form.AppendLog("aaaaaa")

【讨论】:

    猜你喜欢
    • 2017-08-20
    • 1970-01-01
    • 2017-10-07
    • 1970-01-01
    • 2013-11-12
    • 1970-01-01
    • 1970-01-01
    • 2012-12-28
    • 1970-01-01
    相关资源
    最近更新 更多