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