0

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

我的应用程序发送大量电子邮件,比如说 500 封,为了避免应用程序过载,我使用线程来处理存储在 DDBB 中的信息。一切正常,我正在使用代表,我成功地通过客户端发送它们,但我希望应用程序在 MDI 表单标签中显示一条消息,内容类似于“电子邮件发送到:10:00:blabla@gmail.com: 00" 只是为了向用户显示该进程正在后台运行...

我的代码很简单:


- 来自 MDI:

BulkThread = 新线程(新线程开始(AddressOf ProcessBulkList))

BulkThread.Start()


- 从包含 ProcessBulkList 的模块中:

公共代表 Sub MySubPara(ByVal p As String)

公共子ProcessBulkList()

   Dim DelegateMDI As MySubPara = New MySubPara(AddressOf MostrarEnMDI)

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

结束子

Public Sub MostrarEnMDI(para As String)

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

结束子

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

4

3 回答 3

1

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

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

于 2013-07-17T13:21:43.670 回答
1

在您的线程中(在真正的线程中必须通过原始表单可以显示您是否需要该示例)像这样调用委托/调用

showLoadingPicInvoke(0, oldform) ' 0 只是 del / invoke 方法中使用的一个变量,您不必让它们可以删除,oldform(传递给线程的原始表单是必须的。)

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 ( Main Form ).vb 上更改以执行您想要的操作的地方

            'changeText
            'oldform.ControlName.value = value
            'oldform.ControlName.Refresh()


    End If
End Sub
于 2013-07-16T19:19:18.113 回答
0

Invokeon aDelegate动态调用同一线程上的委托。不涉及跨线程消息传递。要更新 GUI,需要从创建您正在修改的控件的线程(即主线程)中完成更新。您需要使用InvokeorBeginInvoke方法在Control正确的线程上运行您的代码。这些方法是 的实现ISynchronizeInvoke,并将调用编组到正确的线程。

于 2013-07-16T17:42:12.480 回答