带有 GUI 的 TCPClient

Posted

技术标签:

【中文标题】带有 GUI 的 TCPClient【英文标题】:TCPClient with a GUI 【发布时间】:2014-03-20 00:53:19 【问题描述】:

我遇到了一个小问题(刚回到 VB),很抱歉我的无知/缺乏理解。

我的第一个项目是重写一个 IRC Channel Quote/Seen Bot 并让它显示加密货币统计数据。无论如何回到问题。

我已经设法让连接正常工作,但是当我尝试从“GetStream.Read”查看数据时,我的 Gui 冻结了,我可以理解为什么会发生这种情况,因为它处于 500 毫秒计时器,但不知道如何防止或克服它。它只是等待更多数据进来。

我希望有人能提出一些想法,或者至少为我指明正确的方向

到目前为止我的代码

Imports System.Net.Sockets
Imports System.Text

Public Class Form1
Dim vClient As New TcpClient()
Dim vIRCNick = "TESTIRCBOT"
Dim vIRCChannel = "#TESTIRCCHAN"
Dim bytesRead As Integer
Dim buffer(1024) As Byte

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

End Sub

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    vClient.Connect("irc.freenode.net", 6667)
    IRCSend("USER " & vIRCNick & " 0 0 :TESTIRCBOT" & vbCrLf)
    IRCSend("NICK " & vIRCNick & vbCrLf)
    IRCSend("JOIN " & vIRCChannel & vbCrLf)

    Timer1.Enabled = True

End Sub

Private Sub IRCSend(vMsg)
    Dim bytes() As Byte = System.Text.ASCIIEncoding.ASCII.GetBytes(vMsg)
    vClient.GetStream.Write(bytes, 0, bytes.Length)
End Sub

Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    IRCSend("PRIVMSG " & vIRCChannel & " :" & TextBox3.Text & vbCrLf)
    TextBox3.Text = ""
End Sub

Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick

    bytesRead = vClient.GetStream.Read(buffer, 0, buffer.Length)
    If bytesRead > 0 Then
        RichTextBox1.Text = RichTextBox1.Text & (System.Text.ASCIIEncoding.ASCII.GetString(buffer, 0, bytesRead))
    End If

End Sub
End Class

【问题讨论】:

我已经编辑了你的标题。请参阅“Should questions include “tags” in their titles?”,其中的共识是“不,他们不应该”。 【参考方案1】:

您正在调用 Read,这是一种同步方法。这意味着它将阻塞当前线程,直到读取数据。当前线程是 UI 线程,因此 UI 冻结。

如果您希望 UI 不冻结,则需要在辅助线程上进行读取。这意味着要么在辅助线程上调用 Read,要么调用 ReadAsync 或 BeginRead。这些选项中的任何一个都会使您的代码复杂化,但这就是多线程的本质。

另请注意,即使您在辅助线程上读取数据,也必须仅在 UI 线程上更新 UI。

【讨论】:

谢谢,我相信 BeginRead 正是我要找的 :) Asyc != 多线程。对于 IRC,一个好的抽象是为每个接收到的行触发一个事件。 @Johannes Kuhn,我们可以讨论并行和异步模式,但事实上异步任务是在辅助线程上执行的。程序员不必知道或关心这一点,但这是现实。 JFYI,还有一种叫做“Async IO”的东西。你知道,IOCP。

以上是关于带有 GUI 的 TCPClient的主要内容,如果未能解决你的问题,请参考以下文章

带有 pyqtgraph 的 GUI 从不刷新

带有 GUI 的 TCPClient

带有 Python 的粒子过滤器 GUI

java 带有Checkbox和字体事件的GUI

带有 PySide2 的文件浏览器:获取文件的路径,然后终止 GUI

带有 Tkinter 和多个文件的 Python GUI