qgis插件开发:利用thread解决界面假死问题
发布于 作者:苏南大叔 来源:程序如此灵动~![](/usr/themes/panda/assets/img/icon/ok.png)
需要在qgis
插件里面,执行一个耗时操作。这个操作进行的时候,界面会假死。点击任何按钮都不会有反应。在耗时函数执行期间,任何更新ui的操作也不会被执行。
这个问题该如何解决呢?如何避免这种耗时操作里面的界面假死问题呢?这个解决方案就是thread
。测试环境:win10
,qgis@3.16.15-hannover
。
错误的写法
正常来说,并不能称之为错误的写法,但是由于是耗时操作,这种传统的写法就不行了。比如:
import time
def main():
# ...
self.iface.messageBar().pushMessage("start", level=Qgis.Success, duration=3)
for i in range(5):
time.sleep(1)
self.iface.messageBar().pushMessage("proccessing", level=Qgis.Success, duration=3)
self.iface.messageBar().pushMessage("done", level=Qgis.Success, duration=3)
正确的写法
import time
from threading import Thread
def main():
# ...
self.iface.messageBar().pushMessage("start", level=Qgis.Success, duration=3)
self.handleCalc()
def handleCalc(self):
def calc():
for i in range(5):
time.sleep(1)
self.iface.messageBar().pushMessage("proccessing", level=Qgis.Success, duration=3)
self.iface.messageBar().pushMessage("done", level=Qgis.Success, duration=3)
t1 = Thread(target=calc)
t1.start()
在函数里面,嵌套一个函数,然后发起一个Thread
,最后thread.start()
。
相关链接
总结
总之,就是把耗时操作都单开一个线程thread
,就不会影响主界面的相应了。
![](/usr/themes/panda/assets/img/icon/end.gif)
![](/usr/themes/panda/assets/img/icon/ok.png)
![](/usr/themes/panda/assets/img/icon/stop.png)