我目前正在使用生成器作为获得长流程进度的快速方法,我想知道它通常是如何完成的,因为我发现它不是很优雅......
让我先解释一下,我有一个 engine.py 模块,它执行一些视频处理(分割、bg/fg 减法等),这需要很多时间(从几秒到几分钟)。
我从一个用 wxpython 编写的 GUI 和一个控制台脚本中使用这个模块。当我查看如何在 wxpython 中实现进度对话框时,我看到我必须以某种方式获取进度值来更新我的对话框,这是你承认的纯逻辑......所以我决定使用我的处理的帧数引擎函数,每 33 帧产生当前帧号,并在处理完成时产生 None。
通过这样做,它看起来像这样:
dlg = wx.ProgressDialog("Movie processing", "Movie is being written...",
maximum = self.engine.endProcessingFrame,self.engine.startProcessingFrame,
parent=self,
style = wx.PD_APP_MODAL | wx.PD_ELAPSED_TIME | wx.PD_SMOOTH | wx.PD_CAN_ABORT)
state = self.engine.processMovie()
f = state.next()
while f != None:
c, s = dlg.Update(f, "Processing frame %d"%f)
if not c:break
f = state.next()
dlg.Destroy()
效果很好,绝对没有明显的速度损失,但是如果我不想的话,我希望能够调用 processMovie() 函数而不必处理生成器。
例如,我使用引擎模块的控制台脚本不关心进度,我可以使用它,但它注定要在没有显示的环境中执行,所以我真的不关心进度......
有人有我想出的另一种设计吗?(使用线程、全局变量、进程等)
我认为必须有一个设计可以干净地完成这项工作:-)