Pyside6 - 如何使用 QThreadPool 多线程避免 QBasicTimer 警告和分段错误

问题描述 投票:0回答:1

我按照本指南在pyside中使用

QThreadPool
进行多线程处理。我有一些工人从事工作的例子,这些工作将而且可能需要很长时间。例如:

def load_bucket_dir(self):
    worker = Worker(UIFunctions.update_bucket_tree, self)
    worker.signals.finished.connect(lambda: widgets.browse_s3_dir.setEnabled(True))
    self.threadpool.start(worker)

此函数将获取用户指定的 s3 存储桶并将内容显示在 QTreeWidget 中。这使用 OIDC 身份验证,需要几秒钟才能完成。

示例2:

def load_bucket_preview(self):
    if self.ui.local_dir.text() and self.ui.s3_dir.text():
        worker = Worker(UIFunctions.update_bucket_preview, self)
        self.threadpool.start(worker)

此功能根据所选文件显示要上传到其 s3 存储桶的文件的预览。此功能的速度取决于选择的文件数量。

我的问题是,每当工作人员启动时,我都会收到如下警告:

QBasicTimer::stop: Failed. Possibly trying to stop from a different thread
QBasicTimer::stop: Failed. Possibly trying to stop from a different thread
QBasicTimer::start: Timers cannot be started from another thread
QObject::killTimer: Timers cannot be stopped from another thread

最终我遇到了分段错误(立即或在一段时间后)。我链接的指南没有指定如何运行多个工作人员,所以我假设我做错了一些事情。

python multithreading segmentation-fault pyside6
1个回答
0
投票

load_bucket_dir
load_bucket_preview
是从 UI 线程还是从工作线程运行?如果它们从您的工作线程运行,您需要让信号存在于 UI 线程对象上,并且工作人员需要
.emit
信号来告诉他们要做什么。

例如,

class MyApplication(QApplication):
    run_task = Signal(typing.Callable)

    def __init__(self):
        super().__init__()
        run_task.connect(lambda task: task())

然后运行一个名为

QApplication.instance().run_task.emit(the_task)
的任务,其中
the_task
Callable

© www.soinside.com 2019 - 2024. All rights reserved.