PyQT安全线程和Socketing,捕获多个信号

时间:2016-03-08 04:12:23

标签: python sockets pyqt signals qthread

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

  1. 即使我试图正确杀死我的线程,我的程序似乎仍然在关闭。避免这种情况的唯一方法是将特定线程设置为守护程序。我正在做什么来杀死它,是使用一个成员( self._terminate = threading.Event())我将在我的closeEvent() GUI中设置。 我的线程将不断检查此终止并返回(如果存在)。 我的套接字也将被关闭 - 子连接将调用它们shutdown(),并且主服务器将发送一些伪数据来推送线程上的listen循环,这也将终止。
  2. 正如我所提到的,所有这些都发生在我的GUI的closeEvent()中,但是当我以这种方式进行设置时,它会在退出时挂起。该程序将隐藏,但shell将保持活动状态,并且它不会死亡。通过将保存服务器套接字的线程设置为守护程序,一切都可以正常关闭。

    这样做是安全的,因为我没有将任何内容写入文件或从文件中读取,是否正确?

    1. 我的问题的第二部分是,我设置了QThread来收集来自我的PriorityQueue的任何传入数据,并根据需要将信号发送到GUI。它每次检查时都会发送所有可用数据,大致如下:
    2. -

      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将捕获这些信号,并在我的测试中 - 将它们添加到最后一个小部件。

      在我的测试中,偶尔会将测试数据组合成一行 - 例如,如果我的队列包含

      • 测试
      • 再次测试
      • 测试更多

      我迅速发出这些信号直到队列为空,偶尔我的列表小部件会有一个双重条目,例如:

      • 测试
      • 再次测试
      • 测试更多
      • 测试
      • 再次测试
      • 测试更多
      • 测试
      • 再次测试更多******

      这是因为我把它们解救得太快了吗?可能导致什么,以及哪些可能的修复?

      感谢所有输入!

0 个答案:

没有答案