Inno设置:ExtractTemporaryFile导致向导冻结

问题描述 投票:2回答:2

我根据用户的选择制作了自定义页面来管理特定的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过程之前显示?

inno-setup extract freeze temporary-files
2个回答
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

1
投票

我知道这是一个旧线程,但我遇到了类似的情况,我使用ExtractTemporaryFile函数提取的一些文件明显慢于其他文件。

经过一番调查后,我在Inno Setup help pages上找到了这个:

启用实体压缩后,请务必在[Files]部分的顶部(或附近)列出临时文件。为了在固体压缩安装中提取任意文件,安装程序必须首先解压缩所有先前文件(到内存中的临时缓冲区)。如果在[Files]部分中的指定文件上方列出了许多其他文件,则会导致严重延迟。

这意味着为了获得最佳性能,您应该使用该函数将要提取的文件移动到[Files]部分的顶部。

© www.soinside.com 2019 - 2024. All rights reserved.