来自不同vb文件中的Thread的VB Net Update GUI

时间:2013-07-16 17:38:40

标签: multithreading

首先,我一直在阅读很多相关内容,但无论如何我都没有得到惊人的答案。我知道我不应该从一个线程更新UI,但在这种情况下我认为是唯一的方法。

我的应用程序发送电子邮件,其中很多,假设500,并且为了避免重载应用程序,我使用线程来处理存储在DDBB中的信息。一切正常,我正在使用委托,我成功通过客户端发送它们,但我希望应用程序在MDI表单标签中显示一条消息,例如“10月10日发送到:blabla@gmail.com的电子邮件: 00“只是为了向用户显示进程在后台运行...

我的代码很简单:


- 来自MDI:

BulkThread =新线程(新ThreadStart(AddressOf ProcessBulkList))

BulkThread.Start()


- 来自包含ProcessBulkList的模块:

Public Delegate Sub MySubPara(ByVal p As String)

公共子ProcessBulkList()

   Dim DelegateMDI As MySubPara = New MySubPara(AddressOf MostrarEnMDI)

   DelegateMDI.Invoke("example@gmail.com")

End Sub

Public Sub MostrarEnMDI(para As String)

    MDI.LabelSMS.Text = "Message sent to: " & para & " at " & GetTime()
    MDI.Refresh()

End Sub

当然在ProcessBulkList函数中有更多的委托和东西,一切都很完美,但这个调用,在MDI表单上没有显示任何内容......可能我正在使用的MDI是原始的MDI,但为什么呢? ???因为使用来自线程的调用应该使用调用主线程中元素队列的SendMessage函数,不是吗?

3 个答案:

答案 0 :(得分:1)

在你的线程中(在真正的线程中必须传递原始表单可以显示你是否需要那个例子)像这样调用Delegate / Invoke

showLoadingPicInvoke(0,oldform)'0只是del / invoke方法中使用的变量,你不必将它们删除,oldform(传递给Thread的原始表单是必须的。)

Delegate Sub changeText(oldform As Form1)
Sub changeTextInvoke(ByVal oldform As Form1)
    If oldform.InvokeRequired Then
        Dim d As New changeText(AddressOf changeTextInvoke)
        oldform.ControlName.Invoke(d, New Object() {oldform})
    Else

以下是您在Form1(主窗体).vb

上更改为执行操作的位置
            'changeText
            'oldform.ControlName.value = value
            'oldform.ControlName.Refresh()


    End If
End Sub

答案 1 :(得分:1)

好的,我刚刚找到了一个解决方案,它将标签作为线程内函数的参数传递,如下所示:

BulkThread =新线程(Sub()ProcessBulkList(ToolStripStatusLabel1)) BulkThread.Start()

答案 2 :(得分:0)

Invoke上的

Delegate动态调用相同线程上的委托。没有涉及跨线程消息传递。要更新GUI,需要从创建您正在修改的控件的线程(即主线程)完成更新。您需要使用Invoke上的BeginInvokeControl方法在正确的主题上运行代码。这些方法是ISynchronizeInvoke的实现,并编组调用正确的线程。