gpt4 book ai didi

vb.net - VB Net - 将数据从线程传递到主 GUI

转载 作者:行者123 更新时间:2023-12-02 11:55:29 26 4
gpt4 key购买 nike

我已经设法在线程中获取我想要的数据,但是我无法将数据传递回我的主线程(GUI)。

我正在线程中从网络流中获取数据,然后需要将其传递到我的主线程以便传递到其他类等。

我已经看到它提到要为此使用后台工作程序,但由于我希望它定期收集数据并且永远不会停止,所以我认为为此使用一个单独的线程是最好的,但我对多线程非常陌生。

如果线程是正确的方法,我如何将数据从它传递回我的主线程以便将其用于其他东西?我已经看到很多次提到的委托(delegate)和事件,但不知道如何用它们传递数据?

谢谢

最佳答案

请研究此示例,并告诉我它是否符合您的要求:

enter image description here

所需控件: lstItems(列表框)、btnStart(按钮)、btnStop(按钮)、Timer1(计时器)。

Form1 代码:

Public Class Form1
Dim p_oStringProducer As StringProducer

Private Sub btnGo_Click(sender As Object, e As EventArgs) Handles btnGo.Click
p_oStringProducer = New StringProducer
p_oStringProducer.Start()
Timer1.Enabled = True
End Sub

Private Sub btnStop_Click(sender As Object, e As EventArgs) _
Handles btnStop.Click
Timer1.Enabled = False
p_oStringProducer.Stop()
End Sub

Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
Dim asQueue As Concurrent.ConcurrentQueue(Of String) =
p_oStringProducer.MessageQueue
While asQueue.Count > 0
Dim sItem As String = Nothing
asQueue.TryDequeue(sItem)
lstItems.Items.Add(sItem)
End While
End Sub
End Class

StringProducer 代码:

Imports System.Threading.Tasks

Public Class StringProducer
Private p_fKeepRunning As Boolean
Private p_oTask As task
Private p_aMessageQueue As Concurrent.ConcurrentQueue(Of String)
Private p_iNextMessageId As Integer

Public ReadOnly Property MessageQueue As _
Concurrent.ConcurrentQueue(Of String)
Get
Return p_aMessageQueue
End Get
End Property

Sub New()
p_oTask = New Task(AddressOf TaskBody)
p_aMessageQueue = New Concurrent.ConcurrentQueue(Of String)
p_iNextMessageId = 0
End Sub

Public Sub Start()
p_fKeepRunning = True
p_oTask.Start()
End Sub

Public Sub [Stop]()
p_fKeepRunning = False
End Sub

Private Sub TaskBody()
While p_fKeepRunning
Threading.Thread.Sleep(2000)
p_aMessageQueue.Enqueue("Message #" & p_iNextMessageId)
p_iNextMessageId += 1
End While
End Sub

Protected Overrides Sub Finalize()
MyBase.Finalize()
Me.Stop()
End Sub
End Class

这尚未经过广泛测试,但它应该可以让您抢占先机。

关于vb.net - VB Net - 将数据从线程传递到主 GUI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20476278/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com