目前,我正试图在我的PySide6 GUI应用程序中实现一些线程功能。我遵循了一个教程来尝试入门(链接是这里),但我似乎无法让它开始工作。尽管该教程使用的是PyQt而不是PySide,但类和结构仍然相似,而且它似乎是在另一个线程上启动的。尽管如此,它还是冻结了主GUI,这在用户实际面临的情况下是不理想的。
下面是我的代码示例:
class Worker(QObject):
finished = Signal(str)
progress = Signal(int)
def run(self, file):
"""Long-running task." that calls a separate class for computation""
b = SeparateClass()
b.doComputation()
self.finished.emit()
class DataPlotting(QMainWindow):
def __init__(self):
self.thread = QThread()
self.worker = Worker()
self.report_builder = QPushButton('Call class that threads')
self.report_builder.setEnabled(False)
self.report_builder.clicked.connect(self.qthread_test)
def qthread_test(self):
file = 'some_file.txt'
self.worker.moveToThread(self.thread)
self.thread.started.connect(self.worker.run(file))
self.worker.finished.connect(self.thread.quit)
self.worker.finished.connect(self.worker.deleteLater)
self.thread.finished.connect(self.thread.deleteLater)
self.thread.start()
return这确实完成了在Worker类中的工作,并提供了所需的结果,但它冻结了GUI。我不太清楚我做错了什么,因为有人建议用这种方法来防止冻结GUI,以便进行大量的计算。
有什么东西我直接丢了吗?还是我走错路了?欢迎任何帮助或指导。
发布于 2022-06-24 00:26:58
我假设您在__init__期间为QMainWindow和QObject的子类进行适当的超类调用。
当您的代码执行self.thread.started.connect(self.worker.run(file))行时,它立即运行函数self.worker.run(file),并将该函数的结果(即None )指定为连接到thread.started信号的插槽。您可以将文件路径作为参数传递给worker实例,并让run方法在执行过程中从self获取路径。
例如,您可以尝试这样的方法:
class Worker(QObject):
finished = Signal(str)
progress = Signal(int)
def run(self):
"""Long-running task." that calls a separate class for computation"""
file = self.some_file
b = SeparateClass()
b.doComputation()
self.finished.emit()
class DataPlotting(QMainWindow):
def __init__(self):
self.report_builder = QPushButton('Call class that threads')
self.report_builder.setEnabled(False)
self.report_builder.clicked.connect(self.qthread_test)
self.threads = []
def qthread_test(self):
worker = Worker()
thread = QThread()
worker.some_file = 'some_file.txt'
worker.moveToThread(thread)
thread.started.connect(worker.run)
worker.finished.connect(thread.quit)
worker.finished.connect(worker.deleteLater)
thread.finished.connect(thread.deleteLater)
thread.start()
self.threads.append(thread)
returnhttps://stackoverflow.com/questions/72737506
复制相似问题