我根据用户的选择制作了自定义页面以管理特定的redist工具。
这些工具链接到用户检查的复选框,如果他想要或不安装这些工具。 然后只在那里出现一个页面,向用户显示每个工具的安装进度。
我在这里遇到的问题是,仅当工具设置的第一个ExtractTemporaryFile完成时,才显示进度页面,显示最后一页就好像已经冻结。
在ExtractTemporaryFile发生之前,我必须让进度页面显示的唯一方法是在任何安装函数之前放置一个MsgBox。 但即使在这种情况下,当ExtractTemporaryFile启动时,进度条动画也会被冻结,直到ExtractTemporaryFile完成...
以下是执行此操作的代码部分:
procedure CurPageChanged(CurPageID: Integer);
begin
If CurPageID=PageInstallationPersonnalisee.ID then
begin
ProgressBarLabelPageInstPerso.Caption := 'Initialisation...';
if InstallTool1 = True then
begin
ProgressBarLabelPageInstPerso.Caption := 'Installing InstallTool1...';
F_InstallTool1();
end;
if InstallTool2 = True then
begin
ProgressBarLabelPageInstPerso.Caption := 'Installing InstallTool2...';
F_InstallTool2();
end;
if InstallTool3 = True then
begin
ProgressBarLabelPageInstPerso.Caption := 'Installing InstallTool3...';
F_InstallTool3();
end;
ProgressBarPageInstPerso.Style := npbstMarquee;
//ProgressBarPageInstPerso.Style := npbstNormal;
ProgressBarPageInstPerso.Position := 100;
CancelWithoutPrompt:=True;
WizardForm.Close;
end;
end;
请注意 ExtractTemporaryFile()
在每个F_InstallTooln()
函数中生成。
设置和文件部分的其他部分可能会有所帮助:
[Setup]
SolidCompression=no
[Files]
;Temporary redists
Source: "{#MyRessourcesPath}InstallTool1_Setup.exe"; DestDir: "{tmp}"; Flags: deleteafterinstall noencryption dontcopy
Source: "{#MyRessourcesPath}InstallTool2_Setup.exe"; DestDir: "{tmp}"; Flags: deleteafterinstall noencryption dontcopy
Source: "{#MyRessourcesPath}InstallTool3_Setup.exe"; DestDir: "{tmp}"; Flags: deleteafterinstall noencryption dontcopy
此处,在第一次完成ExtractTemporaryFile之前,页面PageInstallationPersonnalisee不会显示...
我知道 ExtractTemporaryFile 会导致安装过程出现延迟,但为什么会导致向导冻结?
所以我的问题是:在我的场景中,有没有办法强制向导刷新,以便在启动任何 ExtractTemporaryFile 程序之前显示它?
答案 0 :(得分:1)
我知道这是一个旧线程,但是我面临着类似的情况,其中使用ExtractTemporaryFile
函数提取的某些文件比其他文件要慢得多。
经过一番调查,我在Inno Setup help pages上发现了这一点:
启用固体压缩后,请确保在[文件]部分顶部(或附近)列出您的临时文件。为了在固态压缩安装中提取任意文件,安装程序必须首先解压缩所有先前的文件(到内存中的临时缓冲区)。如果[文件]部分中的指定文件上方列出了许多其他文件,则可能导致大量延迟。
这意味着为了获得最佳性能,应使用该功能将要提取的文件移动到[Files]
部分的顶部。
答案 1 :(得分:0)
ExtractTemporaryFile
确实挂起了向导表单。正如大多数代码所做的那样。
允许强制Windows消息队列被抽取的唯一自定义页面是TOutputProgressWizardPage
(由CreateOutputProgressPage
创建)。
您可以这样做:
function NextButtonClick(CurPageID: Integer): Boolean;
var
ProgressPage: TOutputProgressWizardPage;
begin
if CurPageID = wpReady then
begin
ProgressPage := CreateOutputProgressPage('Preparing installations', '');
ProgressPage.Show;
try
ProgressPage.Msg1Label.Caption := 'Installing 1 ...';
ProgressPage.SetProgress(0, 100);
ExtractTemporaryFile('1.exe');
Exec(...);
ProgressPage.Msg1Label.Caption := 'Installing 2 ...';
ProgressPage.SetProgress(33, 100);
ExtractTemporaryFile('2.exe');
Exec(...);
ProgressPage.Msg1Label.Caption := 'Installing 3 ...';
ProgressPage.SetProgress(66, 100);
ExtractTemporaryFile('3.exe');
Exec(...);
ProgressPage.SetProgress(100, 100);
ProgressPage.Hide;
finally
end;
end;
Result := True;
end;
虽然在现代版本的Windows上有动画进度条,但如果你不能经常调用SetProgress
,它仍然无法正常工作。请注意,SetProgress
调用是在后台处理消息队列的内容。因此,即使其参数不变,也可以调用它。但你不能像ExtractTemporaryFile
一样阻止。
或者,您可以将部署保留到[Files]
部分,并从AfterInstall
event执行安装程序。
[Files]
;Temporary redists
Source: "{#MyRessourcesPath}InstallTool1_Setup.exe"; DestDir: "{tmp}"; \
Flags: deleteafterinstall noencryption dontcopy; AfterInstall: Install1
Source: "{#MyRessourcesPath}InstallTool2_Setup.exe"; DestDir: "{tmp}"; \
Flags: deleteafterinstall noencryption dontcopy; AfterInstall: Install2
Source: "{#MyRessourcesPath}InstallTool3_Setup.exe"; DestDir: "{tmp}"; \
Flags: deleteafterinstall noencryption dontcopy; AfterInstall: Install3