PyQt5读写文件时如何正确实现多线程,保证QFileSystemWatcher正常运行?
问题根因
你代码的核心错误出在信号槽绑定的写法上:
- 你给
thread.started信号绑定回调时,写的是self.worker.runScan(self.param1,self.param2),加了括号相当于直接在主线程同步执行了runScan方法,根本没有把方法作为回调注册给信号,子线程完全没起到作用,自然会阻塞主线程的事件循环,导致QFileSystemWatcher无响应。 - 而你测试用的
run方法绑定时没有加括号,是直接传递的方法引用,会等线程启动后在子线程中执行,所以不会卡住GUI。
修复方法
如果需要给回调函数传参,使用functools.partial或者lambda表达式包裹即可,不要直接调用函数。
步骤1:导入partial
from functools import partial
步骤2:修改信号绑定逻辑
将runLongTask方法里的绑定代码:
self.thread.started.connect(self.worker.runScan(self.param1,self.param2))
替换为:
self.thread.started.connect(partial(self.worker.runScan, self.param1, self.param2))
额外注意事项
- 不要在Worker的
runScan方法以及myModule.userInputFunction中操作任何Qt GUI控件,所有GUI更新逻辑必须通过自定义pyqtSignal抛信号给主线程处理,否则会触发线程安全问题导致崩溃。 - 建议添加运行状态判断,点击启动按钮后置灰,任务结束后再恢复可点击,避免用户多次点击生成多个重复线程。
- 你当前的
userInputFunction仅依赖终端输入、操作本地文件,没有涉及Qt GUI操作,放到子线程运行完全不会影响主线程的事件循环,修复后QFileSystemWatcher就可以正常监听到文件变动,实时触发绘图更新。
内容的提问来源于stack exchange,提问作者Bubbles
相关产品推荐
相关产品推荐

