PySide6中使用QThread时如何避免两个不同线程的任务重叠执行
实现方案
方案1:信号链式触发(固定执行顺序首选)
利用QThread完成后自动发射的finished信号,绑定到第二个线程的start()槽,即可实现前序任务跑完自动启动下一个,全程非阻塞不会卡GUI主线程。
注意:原代码缺少「线程启动触发任务执行」的绑定逻辑,已在示例中补全
from PySide6.QtCore import QThread from MyJobs import LongJob job_a = LongJob() job_b = LongJob() thread_a = QThread() thread_b = QThread() job_a.moveToThread(thread_a) job_b.moveToThread(thread_b) # 绑定线程启动信号触发任务执行 thread_a.started.connect(job_a.run) thread_b.started.connect(job_b.run) # 任务执行完自动退出对应线程 job_a.finished.connect(thread_a.quit) job_b.finished.connect(thread_b.quit) # 线程退出后自动销毁对象避免内存泄漏 job_a.finished.connect(job_a.deleteLater) job_b.finished.connect(job_b.deleteLater) thread_a.finished.connect(thread_a.deleteLater) thread_b.finished.connect(thread_b.deleteLater) # 核心逻辑:a线程执行完成后再启动b线程 thread_a.finished.connect(thread_b.start) # 仅需启动第一个线程,第二个会自动触发执行 thread_a.start()
如果需要调整为先执行b再执行a,只需将绑定逻辑改为thread_b.finished.connect(thread_a.start),初始启动thread_b即可。
方案2:互斥等待(任务触发顺序不固定场景)
如果两个任务没有固定先后顺序、随时可能被触发,要求任意时刻只能运行一个,可通过QMutex+QWaitCondition实现自动排队:
from PySide6.QtCore import QThread, QMutex, QWaitCondition from MyJobs import LongJob # 全局互斥标记 run_mutex = QMutex() wait_cond = QWaitCondition() is_running = False # 封装线程安全的任务类 class SafeLongJob(LongJob): def run(self): run_mutex.lock() global is_running # 有任务在跑时进入等待 while is_running: wait_cond.wait(run_mutex) is_running = True run_mutex.unlock() # 执行原有任务逻辑 super().run() # 任务完成释放标记,唤醒等待的其他任务 run_mutex.lock() is_running = False wait_cond.wakeOne() run_mutex.unlock() # 后续创建任务使用SafeLongJob即可,两个线程可随时调用start(),会自动排队不重叠 job_a = SafeLongJob() job_b = SafeLongJob() # 线程绑定逻辑和方案1一致
内容的提问来源于stack exchange,提问作者icolumbro
相关产品推荐
相关产品推荐

