我正在编写一些目前使用标准线程,队列,pyqt中的QThreads和套接字的代码。 基本上我打开一个套接字服务器,并从其他程序接收数据。我在这里有几个问题。
self._terminate = threading.Event()
)我将在我的closeEvent()
GUI中设置。
我的线程将不断检查此终止并返回(如果存在)。
我的套接字也将被关闭 - 子连接将调用它们shutdown()
,并且主服务器将发送一些伪数据来推送线程上的listen循环,这也将终止。正如我所提到的,所有这些都发生在我的GUI的closeEvent()
中,但是当我以这种方式进行设置时,它会在退出时挂起。该程序将隐藏,但shell将保持活动状态,并且它不会死亡。通过将保存服务器套接字的线程设置为守护程序,一切都可以正常关闭。
这样做是安全的,因为我没有将任何内容写入文件或从文件中读取,是否正确?
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将捕获这些信号,并在我的测试中 - 将它们添加到最后一个小部件。
在我的测试中,偶尔会将测试数据组合成一行 - 例如,如果我的队列包含
我迅速发出这些信号直到队列为空,偶尔我的列表小部件会有一个双重条目,例如:
这是因为我把它们解救得太快了吗?可能导致什么,以及哪些可能的修复?
感谢所有输入!