线程是工作区,而您想要管理作业的执行方式。在这种情况下,必须管理任务 B 以在任务 A 完成时执行,反之亦然,使用信号。
import random
import time
from PySide6.QtCore import QCoreApplication, QObject, QThread, QTimer, Qt, Signal, Slot
class LongJob(QObject):
started = Signal()
finished = Signal()
@Slot()
def run_task(self):
assert QThread.currentThread() != QCoreApplication.instance().thread()
self.started.emit()
self.long_task()
self.finished.emit()
def long_task(self):
t = random.randint(4, 10)
print(f'identifier: {self.property("identifier")}, delay: {t} seconds')
for i in range(t):
time.sleep(1)
print(f"{i+1} seconds")
if __name__ == "__main__":
import sys
app = QCoreApplication(sys.argv)
job_a = LongJob()
job_a.setProperty("identifier", "job_a")
job_b = LongJob()
job_b.setProperty("identifier", "job_b")
thread_a = QThread()
thread_a.start()
job_a.moveToThread(thread_a)
thread_b = QThread()
thread_b.start()
job_b.moveToThread(thread_b)
job_a.finished.connect(job_b.run_task, Qt.QueuedConnection)
job_b.finished.connect(job_a.run_task, Qt.QueuedConnection)
# start task
QTimer.singleShot(0, job_a.run_task)
sys.exit(app.exec())