Python QtCore.qunnable原因SIGSEV(PyQt5)
我正在尝试使用PyQt5在不同的线程中运行进程,以避免阻塞UI线程(主线程) 我创建了QtCore.QRunnable和QObject类的子类,将我的函数传递给线程池,并希望通过使用信号获得run函数的结果。 在我的主UI中,我创建了worker并将其连接到回调,然后启动worker。 在本例中,fn不执行任何操作,回调只打印值。 当我运行此代码时,它会崩溃,并显示以下消息:Python QtCore.qunnable原因SIGSEV(PyQt5),python,pyqt5,python-multithreading,Python,Pyqt5,Python Multithreading,我正在尝试使用PyQt5在不同的线程中运行进程,以避免阻塞UI线程(主线程) 我创建了QtCore.QRunnable和QObject类的子类,将我的函数传递给线程池,并希望通过使用信号获得run函数的结果。 在我的主UI中,我创建了worker并将其连接到回调,然后启动worker。 在本例中,fn不执行任何操作,回调只打印值。 当我运行此代码时,它会崩溃,并显示以下消息: 过程结束,退出代码139(被信号11:SIGSEGV中断) 我做错了什么,如何连接到worker以接收函数的返回值而不破
过程结束,退出代码139(被信号11:SIGSEGV中断)
我做错了什么,如何连接到worker以接收函数的返回值而不破坏代码或UI?
,但它只是关于QThreads,而不是QRunnable,因为QRunnable在aik中的功能不同
from PyQt5.QtWidgets import QMainWindow, QApplication
from PyQt5 import QtCore
import sys
class Worker(QtCore.QRunnable, QtCore.QObject):
trigger = QtCore.pyqtSignal(int)
def __init__(self, function, *args, **kwargs):
super().__init__()
self.function = function
self.args = args
self.kwargs = kwargs
@QtCore.pyqtSlot()
def run(self):
self.function(*self.args, **self.kwargs)
self.trigger.emit(1)
class Window(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("Title")
self.threadpool = QtCore.QThreadPool()
self.show()
self.run_fn()
def test_fn(self, i=0):
return i
@QtCore.pyqtSlot()
def test_callback(self, i):
print(i)
def run_fn(self):
worker = Worker(self.test_fn, 1)
worker.trigger.connect(self.test_callback)
self.threadpool.start(worker)
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Window()
sys.exit(app.exec_())
当然我重新编排了问题的格式。谢谢你提供@eyllanesc的链接。你能解释一下为什么代码会抛出SIGSEGV吗?我没有将多重继承问题与该错误联系起来,也没有走得那么远。PyQt有很多限制,其中QObject和QRunnable之间不能存在多重固有属性(PyQt只允许在某些情况下使用它们),因此,即使您想这样做,某些事情最终也不会被构建(对于某些非常重要的变量,它不是保留内存),但您尝试使用它的某些方法来访问未分配的内存,从而导致该众所周知的错误。