背景
最近在开发过程中,遇到了一个问题,我们需要通过点击一个按钮来执行一个耗时操作。若是一般的耗时操作,则进行一个异步设计即可。
但是此点特殊的情况在于,此耗时操作是个循环,且耗时极长,还需要在每次单个循环结束的时候刷新UI。这就导致异步操作变得不可行。我们只能选择通过创建子线程的方式去达成目标。这本是一个基础的UI开发问题,但是由于小组内缺少有经验的UI开发人员,只能其他开发边学边写。
详细思考与开发过程
首先先对到我手中的代码状态进行下说明,经过几次修正之后,到我手中的代码非常之神奇。阻塞是照阻不误的,刷新居然是隔几分钟刷新一次的,虽然我的算法部分依旧在运行,但是这个UI状态……如何让产品满意?领导可都是产品人员,这不得被diao死?下面是经过我调研理解之后的代码迭代过程:
step1:DEMO设计
在一开始的可行性开发DEMO如下,简单说其实很就是,点击按钮连接到点击槽函数上,槽函数执行单次的耗时操作,此耗时操作使用了Qthread线程摘出去运行。代码示例如下:
class TestWorker(QThread):
result_ready = pyqtSignal(bool, int, str) # 发送结果、行号和测试项文本
def __init__(self):
super().__init__()
def run(self):
# 执行耗时操作
result = func()
self.result_ready.emit(result, self.row, self.item_text)
class MainWindow(QWidget):
'''
主窗口,用以定义主窗口布局以及总控系统UE、线程
类变量: