我有一个Inno Setup的安装执行一些耗时“AfterInstall”行动。 而在执行此操作时,安装界面是完全冻结(似乎它的主要事件循环不处理)。 这不是一个愉快的终端用户体验,所以也许它在某种程度上可能此操作不冻结GUI? 就像在单独的线程中执行,或定期调用类似handleGuiEventLoop()
Answer 1:
该输出进度页面被设计用于在长时间运行操作提供反馈。
但为了这个有效,你必须能够保持创新科技更新您目前的进展情况定期调用此页面上的方法。
还有,可以让你一个库传递一个创新科技脚本函数作为回调到一个DLL ,这可能是有用的。 你也可能想看看使用来自同一个站点,它可以让你从内创新科技本身做HTTP访问ITDownload脚本,避免了中间人。
然而英诺本质上是单线程和GUI线程仿射,所以直接调用阻塞操作会始终阻止没有特别规定的UI。 从一个单独的线程中运行的代码(仅在DLL,但是,你必须非常小心)是可能的; 其他选择包括只使得异步调用,或在内部保持的GUI的更新,如呼叫Exec
。
Answer 2:
有两种方法来改善体验(他们是从一个角度API点不同而已,内部都做同样的 - 他们抽Windows消息队列):
使用
TOutputProgressWizardPage
呈现的操作进度。 它SetProgress
方法在内部调用VCLTApplication.ProcessMessages
,该泵的Windows消息队列。使用
CreateOutputProgressPage
创建页面。一些例子:
- Inno Setup的获取从.NET框架4.5(或更高版本)的安装进度更新进度条的位置
- 如何不结冰刻不容缓- Inno Setup的
- Inno Setup的-让Inno Setup的安装程序报告它的安装进度情况,掌握安装
- Inno Setup的:ExtractTemporaryFile导致向导冻结
- Inno Setup的torrent下载执行
- Inno Setup的-如何添加多个弧形文件解压缩?
通过调用WinAPI的明确抽取Windows消息队列
DispatchMessage
。对于一些示例,请参阅
AppProcessMessage
功能:- 局域网我的SQL Server发现通过侦听端口(Inno Setup的)
- 如何不会阻塞InnoSetup UI执行7zip的?
- 和别的
在这两种情况下,你必须添加触发消息队列抽电话。 通常在一些循环,它的处理。
在某些情况下,你将无法做到这一点。 例如,当使用一个阻塞调用到外部应用(例如,使用Exec
或ShellExec
)做的处理。 您可以变通方法,通过计划,将定期触发定时器时,函数运行时。
这种方法是使用上面链接,即一些例子:
- Inno Setup的-让Inno Setup的安装程序报告它的安装进度情况,掌握安装
- Inno Setup的torrent下载执行
文章来源: Inno Setup: How to modify long running script so it will not freeze GUI?
标签:
inno-setup