Python PyQt:使用线程时访问对象
我目前正在处理一个问题,但我有一个问题: 虽然标记模块速度非常快,但它无法发挥神奇的作用,因为它在每次更改内容时都会处理整个文本,因此当按住backspace键时,程序将变得无响应 如何使用线程(subprocess,QThread)来实现以下目标Python PyQt:使用线程时访问对象,python,multithreading,queue,pyqt,Python,Multithreading,Queue,Pyqt,我目前正在处理一个问题,但我有一个问题: 虽然标记模块速度非常快,但它无法发挥神奇的作用,因为它在每次更改内容时都会处理整个文本,因此当按住backspace键时,程序将变得无响应 如何使用线程(subprocess,QThread)来实现以下目标 在处理过程中更改文本时,作业被推送到队列中。如果队列已包含作业,则此作业将替换为新作业 当更改文本且队列中没有作业时,将执行新作业 作业完成后,将执行队列中的作业。如果没有,我们就完了 澄清 我并不想要上面的算法,而是想要一种实现持续但不减慢渲染类型
最佳情况:快速连续地在一个巨大的文档上键入内容时,渲染视图每隔几个字左右就会更新一次,而编辑器会一直做出响应。在每次文本更改时如何执行以下操作:检查渲染线程是否已经工作(标记)如果不是:让它呈现文本编辑器内容的副本。渲染线程在每次渲染结束时根据编辑器的最后一次输入检查编辑器的当前内容。如果有差异:重新加载。对我来说,这看起来像是
QThreadPool
和QRunnable
的作业:
- 创建从
派生的类,描述“渲染作业”QRunnable
- 创建
,将QThreadPool
设置为1(非常重要,因为一次只能有一个渲染线程)maxThreadCount
- 每次文本更改时,创建“渲染作业”类的实例(可能启用了
),并使用autoDelete
将其添加到线程池中QThreadPool.start()
维护自己的挂起作业队列,因此如果当前正在运行另一个作业,则新作业不会丢失。在这种情况下,它将在当前作业完成后执行QThreadPool
.textChanged
信号上启动作业,而应通过QTimer
间接启动作业。每次文本更改时,请以500毫秒的超时时间重新启动计时器,如果计时器实际发出.timeout
,则只启动新的“渲染作业”
在实现“渲染作业”类时,请记住不要直接访问任何GUI类。相反,在“渲染作业”类中定义一个信号,渲染完成后,该信号将以渲染的HTML字符串作为参数发出,并将其连接到显示小部件的.setText()
这并不是您所要求的,因为正在运行的渲染作业从未中断,而是始终完成。因此,如果文本变化非常快(如用户按住backspace键),预览可能会在一定程度上失去同步。但是,我认为这是解决问题的最简单、最直接的解决方案,因为它不需要锁定、同步或跟踪当前正在运行的作业。每一个作业都是真正异步运行的,以一种类似于“点燃并忘记”的方式运行。听起来不错,但请添加代码;我没有线程工作。无论我使用什么api,一切都会崩溃。在完成工作之前,你因为创建了
QThreadPool
和QRunnable
的思维形象而获得了投票权™ ;) 现在我将阅读答案……现在我接受了它,因为我强烈怀疑“记住不要直接访问任何GUI类”是我的错误。(也就是说,我没有“记住”它,因为我从来没有听说过它)第三条关于“这并不是你想要的”:我的意图是:防止渲染减慢一切。它不必一直保持完美同步,但它必须在用户打字时更新,以防止快速打字机长时间阻止渲染。因此,计时器解决方案不合适,因为我希望在键入期间进行渲染。我会在如何准确地编辑,但我想我可以让它运行与您的信息。