Python 当连接类型=Qt.DirectConnection时,来自线程对象的PyQt5信号会导致segfault

Python 当连接类型=Qt.DirectConnection时,来自线程对象的PyQt5信号会导致segfault,python,multithreading,pyqt,pyqt5,Python,Multithreading,Pyqt,Pyqt5,我有一些PyQt5 python代码,可以下载一组文件。我使用multiprocessing.dummy作为线程的包装,使用apply\u async获得同步下载。 从我的线程函数中,我想更新主gui中的进度条,但当我这样做时,QT会选择信号的排队连接,主线程中播放下载文件的函数开始(文件已下载),然后,进度条突然更新,报告文件正在下载,尽管他们已经下载了一些时间 如果我使用Qt.DirectConnection创建信号,我将获得所需的行为,但在下载文件后,我将获得一个segfault,主线程将

我有一些PyQt5 python代码,可以下载一组文件。我使用multiprocessing.dummy作为线程的包装,使用apply\u async获得同步下载。 从我的线程函数中,我想更新主gui中的进度条,但当我这样做时,QT会选择信号的排队连接,主线程中播放下载文件的函数开始(文件已下载),然后,进度条突然更新,报告文件正在下载,尽管他们已经下载了一些时间

如果我使用Qt.DirectConnection创建信号,我将获得所需的行为,但在下载文件后,我将获得一个segfault,主线程将退出。我相信一定有办法解决这个问题,因为这不是一个不寻常的任务,但在尝试了互斥、信号对信号以及其他一些尝试之后,我几乎要把自己的头发扯下来了。我相信答案是显而易见的

我已经阅读了其他关于类似问题的答案,但没有什么特别有启发性的

建议从创建的线程内部进行连接,但我不愿意尝试这种方法,因为线程是在一个类中创建的,该类在主线程中合成为一个自定义对象,并且我真的不想在层次结构中传递引用。如果必须的话,我想,但是我尝试将线程函数中的一个信号连接到调用该信号的类中的方法,但是没有运气,结果是一样的


非常感谢。

我最终发现segfault是由调用thread\u pool.apply\u async后从主线程加入threadpool引起的。我删除了close和join语句,信号上的directconnection工作正常,正如预期的那样。我继续得到警告:

QObject::setParent: Cannot set parent, new parent is in a different thread
但该计划如预期般奏效。
谢谢

请提供一个。代码位于github的dependencies分支下。我现在将创建一个最小的示例,但同时这里有一个链接-有问题的代码在packages.py文件中,函数是download\u packages。在kxfed.py的第67行进行连接。如果我在连接代码中添加'type=Qt.DirectConnection',问题就会出现。我无法用pyqt制作一个最小、完整且可验证的示例。我必须使用pyuic创建一个新的主窗口,然后对其其余部分进行编码,这肯定不会是最小的。这个警告很重要,所以请不要简单地忽略它。您的程序可能运行正常,但仍存在潜在问题。谢谢。这是我的第一个QT和第二个Python应用程序,我最终发现整个QT信号都是反向的。我试图在一个子类上定义信号,该子类将调用超类方法。最后,我意识到我需要在超类中定义信号,然后将对这些信号的引用传递给子类。