gpt4 book ai didi

python - PyQT 线程和套接字安全,并捕获多个信号

转载 作者:行者123 更新时间:2023-12-03 11:59:50 25 4
gpt4 key购买 nike

我目前正在编写一些使用标准线程、队列、pyqt 中的 QThreads 和套接字的代码。
基本上我打开一个套接字服务器,并从其他程序接收数据。我在这里有几个问题。

  • 即使我尝试正确杀死我的线程,我的程序似乎也会在关闭时挂起。避免这种情况的唯一方法是将特定线程设置为守护进程。我正在做什么来杀死它,正在使用一个成员(self._terminate = threading.Event() ) 我会在我的 closeEvent() 中设置我的图形用户界面。
    我的线程会不断检查这个终止并在它存在时返回。
    我的套接字也将关闭 - 子连接将有 shutdown()调用它们,主服务器将发送一些虚假数据以将监听循环推送到线程上,该线程也将终止。

  • 正如我所提到的,所有这一切都发生在 closeEvent()我的 GUI,但是当我以这种方式设置它时,它会在退出时挂起。程序会隐藏,但外壳会保持事件状态,而且它并没有死。通过将持有服务器套接字的线程设置为守护进程,一切正常。

    这是安全的,因为我没有将任何内容写入文件或从文件中读取,对吗?
  • 我的第二部分问题是我有一个 QThread设置为从我的 PriorityQueue 收集任何传入数据,并根据需要向 GUI 发送信号。每次检查时都会发送所有可用数据,大致类似于:

  • -
    class DataCollector(QtCore.QThread):
    dataSig = QtCore.SIGNAL('data')

    def __init__(self, q):
    super(DataCollector, self).__init__(None)

    self.check_time = 5
    self.scan_time = 0.2
    self.last_check = time.time() - self.check_time
    self.queue = q
    self._terminate = False

    def run(self):
    while True:
    if self._terminate:
    return

    time.sleep(self.scan_time)

    if time.time() > self.last_check + self.check_time:
    while self.queue.empty is False:
    data = self.queue.get()
    self.emit(self.dataSig, data)

    然后,我的主 UI 将捕获这些信号,并在我的测试中 - 将它们添加到最后一个小部件。

    在我的测试中,有时,测试数据会合并成一行 - 例如,如果我的队列包含
  • 测试
  • 再次测试
  • 测试更多

  • 我快速发出这些信号,直到队列为空,有时我的列表小部件会有一个双重条目,例如:
  • 测试
  • 再次测试
  • 测试更多
  • 测试
  • 再次测试
  • 测试更多
  • 测试
  • 再次测试测试更多******

  • 这是因为我开得太快了吗?什么可能导致这种情况,有哪些可能的修复方法?

    感谢您的任何和所有输入!

    最佳答案

    我怀疑它与信号的速度无关,因为 QT 在内部以队列类型的方式处理这些。
    我认为正在发生的事情是,当您调用 send 时,您的印象是或 sendall从一个套接字,所有数据都作为一个数据包发送,当你 recv(bytes) ,它将一次接收一个发送的完整数据包。
    不是这种情况。数据以类似流的方式发送,因此您最终可以得到 block 或组合结果。有两种方法可以解决这个问题:

  • 在每个数据包的开头发送一些数据,说明以下数据的长度(以字节为单位),然后是 recv那么多。
  • 发送带有分隔符的数据,例如,如果您的分隔符是 |!| ,发送的数据为:test|!| , testAgain|!| , testMore|!| .然后你在你的接收线程上处理这个。例如,流可能第一次通过:test|!|testA ,后跟 gain|!|testMore|!|第二次。

  • 在您的线程中,您可以处理按给定分隔符拆分接收到的数据,并保留未完成的 block ,直到找到下一个分隔符。

    关于python - PyQT 线程和套接字安全,并捕获多个信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35858814/

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