It would be rather difficult to update the progress bar, while another process is running.
I do not see a point of endeavoring it, as you are unlikely able to tell the progress of the sub-installer, so you won’t know what to update the progress bar to.
Except for special cases, when the sub-installer provides an API to report its progress.
For an example, see:
- Inno Setup Get progress from .NET Framework 4.5 (or higher) installer to update progress bar position or
- Make Inno Setup Installer report its installation progress status to master installer.
To update the progress bar according to number of sub-installers finished, you can do:
[Run]
FileName: "process1"; BeforeInstall: SetProgress(0); AfterInstall: SetProgress(33)
FileName: "process2"; AfterInstall: SetProgress(66)
FileName: "process3"; AfterInstall: SetProgress(100)
[Code]
procedure SetProgress(Position: Integer);
begin
WizardForm.ProgressGauge.Position :=
Position * WizardForm.ProgressGauge.Max div 100;
end;
To divide part of the progress range for installing files and the rest to running the sub-installers, see
Inno Setup – Prevent extraction of files from setting progress bar to 100%
Another option is to use a “marquee” (= infinite) progress bar style.
See Progress bar control styles.
[Run]
FileName: "process1"; BeforeInstall: SetMarqueeProgress(True)
FileName: "process2"
FileName: "process3"; AfterInstall: SetMarqueeProgress(False)
[Code]
procedure SetMarqueeProgress(Marquee: Boolean);
begin
if Marquee then
begin
WizardForm.ProgressGauge.Style := npbstMarquee;
end
else
begin
WizardForm.ProgressGauge.Style := npbstNormal;
end;
end;
Works even on Windows XP, despite not being listed in the official Microsoft documentation anymore. Tested on Windows XP SP3.