Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading VB Net从不同VB文件中的线程更新GUI_Multithreading - Fatal编程技术网

Multithreading VB Net从不同VB文件中的线程更新GUI

Multithreading VB Net从不同VB文件中的线程更新GUI,multithreading,Multithreading,首先,我读了很多关于这方面的书,但是我没有得到一个奇怪的答案。我知道我不应该从线程更新UI,但在这种情况下,我认为这是唯一的方法 我的应用程序发送电子邮件,很多,比如说500封,为了避免应用程序过载,我使用一个线程来处理DDBB中存储的信息。一切正常,我正在使用代理并成功地通过客户端发送它们,但我希望应用程序在MDI表单标签中显示一条消息,如“电子邮件发送至:blabla@gmail.com在10:00:00“只是向用户显示进程正在后台运行 我的代码很简单: -从MDI: BulkThread

首先,我读了很多关于这方面的书,但是我没有得到一个奇怪的答案。我知道我不应该从线程更新UI,但在这种情况下,我认为这是唯一的方法

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

我的代码很简单:


-从MDI: BulkThread=新线程(新线程开始(ProcessBulkList的地址))

BulkThread.Start()


-从包含ProcessBulkList的模块: 公共委托子MySubPara(ByVal p作为字符串)

公共子进程列表()

端接头

公共子MostrarEnMDI(段作为字符串)

端接头


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

委托上调用
,在同一线程上动态调用委托。不涉及跨线程消息传递。要更新GUI,需要从创建要修改的控件的线程(即主线程)进行更新。您需要使用
控件上的
Invoke
BeginInvoke
方法在正确的线程上运行代码。这些方法是ISynchronizeInvoke的实现,并将调用封送到适当的线程。

在线程中(在真正的线程中,必须传递原始形式,如果需要该示例,可以向您显示)这样调用委托/调用

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

下面是您在Form1(主窗体).vb上更改以执行所需操作的地方


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

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

我已经看到了结果,但我不想一直打扰用户,我想要outlook中的状态栏,在那里你可以看到“从XXX发送消息1”…而不会使系统的其余部分过载。@AsuncionCarreigos,在这里找到一个-下载控件:P,这应该可以完成这个任务。这个代码看起来不错,但我不想让自己太复杂。我只想更改线程的ToolstripStatusLabel文本属性。编辑答案以包含del/invoke示例以更改主线程上的内容。在我运行线程发送电子邮件之前,已在MDI表单中创建控件(本例中为标签),那么我该如何做???知道吗?再看一遍我的帖子。只需调用
MDI.LabelSMS.Invoke
即可调用设置标签的方法,而不是直接设置标签。很抱歉,我没有说标签位于底部的StatusStrip栏上,因此我无法访问Invoke方法(我不知道为什么要这样做…)好的,我无法访问invoke方法,因为它不是一个控件…我一直在阅读有关它的文章,但我真的不知道如何完成它。。。有人说要调用statusstrip,但是…不知道如何继续。。。如果我已经在线程中,我应该如何调用statuststrip???
   Dim DelegateMDI As MySubPara = New MySubPara(AddressOf MostrarEnMDI)

   DelegateMDI.Invoke("example@gmail.com")
    MDI.LabelSMS.Text = "Message sent to: " & para & " at " & GetTime()
    MDI.Refresh()
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
            'changeText
            'oldform.ControlName.value = value
            'oldform.ControlName.Refresh()


    End If
End Sub