PyQt5 qthreadpool 调用主线程函数会报错怎么解决?
时间: 2023-08-14 13:02:21 浏览: 145
在使用 PyQt5 的 qthreadpool 进行多线程编程时,如果需要调用主线程的函数,需要使用 PyQt5 的信号与槽机制来实现。直接在子线程中调用主线程函数会导致线程不安全,从而导致程序崩溃或者出现未知错误。
下面是一个使用信号与槽机制调用主线程函数的简单示例:
```python
from PyQt5.QtCore import QObject, pyqtSignal, QThreadPool, QRunnable
class WorkerSignals(QObject):
finished = pyqtSignal()
result = pyqtSignal(object)
class Worker(QRunnable):
def __init__(self, func, *args, **kwargs):
super(Worker, self).__init__()
self.func = func
self.args = args
self.kwargs = kwargs
self.signals = WorkerSignals()
def run(self):
result = self.func(*self.args, **self.kwargs)
self.signals.result.emit(result)
self.signals.finished.emit()
class MainWindow(QWidget):
def __init__(self):
super().__init__()
self.threadpool = QThreadPool()
self.initUI()
def initUI(self):
self.setWindowTitle('MainWindow')
self.setGeometry(100, 100, 300, 200)
button = QPushButton('Start', self)
button.clicked.connect(self.start_work)
button.move(100, 100)
self.show()
def start_work(self):
worker = Worker(self.do_work)
worker.signals.result.connect(self.on_result)
self.threadpool.start(worker)
def do_work(self):
# 子线程的工作
return 'result'
def on_result(self, result):
# 主线程的函数
print(result)
```
在这个例子中,我们创建了一个 Worker 类来执行子线程的工作,当子线程工作完成时,通过信号 result 将结果发送到主线程的 on_result 函数中进行处理。在 start_work 函数中,我们通过 threadpool 来启动子线程。
阅读全文
相关推荐












