gpt4 book ai didi

python - 线程退出后Qt处理信号吗?

转载 作者:行者123 更新时间:2023-12-03 13:00:39 24 4
gpt4 key购买 nike

我正在构建具有GUI和几个工作线程的应用程序。现在,我希望它成为一个多线程应用程序,因此我要在一个循环中多次执行同一线程,每个线程都在该线程外部的类中获取定义的不同输入参数。

所以我的mainGui.py文件看起来像这样(仅显示相关代码):

self.workers = [worker.Worker(), worker.Worker(), worker.Worker()]
for i in xrange(threadCount):
self.currentWorker = self.workers[i]
self.currentWorker.alterTable.connect(self.alterMainTable)
self.currentWorker.start()
time.sleep(0.1)

您可能会想到,我正在将Worker的 alterTable信号连接到在主GUI线程中定义的 alterMainTable()方法。此方法更新GUI中的表。

工作线程如下所示:
class Worker(QThread):

alterTable = Signal(dict)

def __init__(self, parent=None):
super(Worker, self).__init__(parent)

def sendToTable(self, param1, param2, param3):
"""This method emits the signal with params as defined above"""
params = {}
params["param1"] = param1
params["param2"] = param2
params["param3"] = param3
self.alterTable.emit(params)

def run(self):
#Perform a lengthy task, do this every now and then:
self.sendToTable(param, param2, param3)

当我在单个工作线程中运行此应用程序时(因此,当我不在主线程中调用该循环时),它可以正常工作-发出信号,并更新GUI中的主表。

但是,当我一次运行多个线程时,就会出现问题。 Worker线程完成其工作,但有时仅发出信号。或者,更好的是,它被发出,好像Qt(或其他任何东西)正在等待所有线程完成,然后更新表一样。从字面上看,这是发生的事情-我可以在Python控制台中看到线程正在执行其任务,并且一旦所有的 做完他们正在做的事情,该表就会突然被大量数据填充。

您可能会想到,由此引起的另一个问题是,由于没有任何事件正在处理,因此一段时间后,我的应用程序似乎被冻结了。

我尝试将Qt.DirectConnection添加到connect()方法中,但这并没有真正的帮助。

奖励问题:我已经在SO和其他网站上阅读了有关此主题的信息,似乎人们推荐QRunnable()而不是QThread(),尤其是在将其子类化时。因此,我将使用QThreadPool()。但是,当我尝试这样做时,似乎无法从QRunnable发出信号-它给了我AttributeError: 'PySide.QtCore.Signal' object has no attribute 'connect',即使Signal在QRunnable类中定义了-这很奇怪,我必须说。

编辑:关于SO的另一种回答是,有人提到一个人可能正在用要处理的事件来“散布”主GUI线程。但是,我不相信这种情况,因为QThread中的sendToTable()方法最多只能从该线程调用5-6次,而且threadCount最多不会大于20,但是我通常将其保持在大约5。

最佳答案

而且,像往常一样,经过2天的调试和在SO上发布几分钟后,我回答了我的问题。

在所有线程启动之后,我有一个剩余的workerThread.wait()方法调用。因此,很自然地,我的应用程序执行了被告知要执行的操作-等待线程完成。

我删除了该方法调用,并将QCoreApplication.processEvents()放入启动线程的循环中,现在所有操作都像一个魅力。

再次感谢您,SO的无形,全能的人!

关于python - 线程退出后Qt处理信号吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13618959/

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