gpt4 book ai didi

.net - 你如何让 Inno Setup 在执行长执行时看起来不卡住?

转载 作者:行者123 更新时间:2023-12-01 08:01:23 25 4
gpt4 key购买 nike

Exec正在安装 .NET 3.5,输出脚本基于此:
http://www.blackhillsoftware.com/blog/2006/06/26/using-innosetup-with-the-dotnet-framework/

问题是它使用了 ewWaitUntilTerminated因为我们需要捕获退出代码。由于我们正在运行它,它变得更糟了/passive /norestart这样用户的工作就更少了(也许我们不应该?)

我能想到的最简单的选择是在安装.NET 时隐藏窗口并在完成后再次显示它,但我不知道该怎么做。

理想的解决方案是显示一个进度页面,但这似乎不太可能,因为我们需要立即返回,但在进程退出时仍会以某种方式收到通知并捕获退出代码,否则我们会只是有一个永恒的进度条。

关于如何解决这个问题的任何想法?

编辑:最小化可能会更好,但也不知道该怎么做。我们确实会显示一条消息,通知用户该过程可能需要 10-20 分钟,但问题是主设置表单完全卡住,无法移动、最小化或对其进行任何操作。也在运行/passive在较慢的机器上,.NET 安装程序实际上在一两分钟内没有显示任何进度。

最佳答案

使 Inno Setup“看起来不卡住”的一种方法是添加一个“假”进度指示器,如选取框,以显示正在发生的事情。但这并不能解决“窗口不可拖动/移动”的问题。

所以,另一种方法是真正解冻 Inno Setup GUI,同时执行一个长时间运行的进程:
“长时间运行的进程”通过 ShellExecuteEx() 执行.
然后安装程序使用带有条件的while循环WaitForSingleObject和一个非常小的超时
执行AppProcessMessage .
AppProcessMessage本身就是一个辅助函数。它使用“通用”代码重新创建 Application.ProcessMessages -ish 过程,使用 WinAPI 函数 PeekMessage() , TranslateMessage()DispatchMessage() .
它的工作是成为 Inno Setup GUI 的消息泵。

这个技巧使窗口再次响应/可拖动,
而“长时间运行的进程”在后台处理。

这是执行循环的来源:

if ShellExecuteEx(ExecInfo) then
begin
while WaitForSingleObject(ExecInfo.hProcess, 100) = WAIT_TIMEOUT
do begin
AppProcessMessage;
WizardForm.Refresh();
end;
CloseHandle(ExecInfo.hProcess);
end;
unzip.iss 的以下 GIST包含独立的代码 Unzip Helper for executing 7zip without blocking the Inno Setup GUI ,包括使用 AppProcessMessage 的点点滴滴功能。

在这种情况下,“解压缩”只是一个示例,您可以将执行的应用程序替换为 .NET 安装程序或任何其他长时间运行的任务。

关于.net - 你如何让 Inno Setup 在执行长执行时看起来不卡住?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/591899/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com