【问题标题】:How to delay without freezing in Inno Setup如何在 Inno Setup 中延迟而不冻结
【发布时间】:2017-02-11 00:34:50
【问题描述】:

您好,我想知道如何在 Inno Setup Pascal 脚本中将工作(或命令)延迟指定时间。

内置的Sleep(const Milliseconds: LongInt) 在睡眠时冻结所有工作。

我实现的以下功能也使WizardForm 无响应但不像内置Sleep() 功能那样冻结。

procedure SleepEx(const MilliSeconds: LongInt);
begin
  ShellExec('Open', 'Timeout.exe', '/T ' + IntToStr(MilliSeconds div 1000), '', SW_HIDE,
            ewWaitUntilTerminated, ErrorCode);
end;

我也读过this,但想不出如何在我的函数中使用它。

我想知道如何在这个SleepEx 函数中使用WaitForSingleObject

提前感谢您的帮助。

【问题讨论】:

    标签: inno-setup sleep pascalscript


    【解决方案1】:

    使用自定义进度页面(CreateOutputProgressPage function):

    procedure CurStepChanged(CurStep: TSetupStep);
    var 
      ProgressPage: TOutputProgressWizardPage;
      I, Step, Wait: Integer;
    begin
      if CurStep = ssPostInstall  then
      begin
        // start your asynchronous process here
    
        Wait := 5000;
        Step := 100; // smaller the step is, more responsive the window will be
        ProgressPage :=
          CreateOutputProgressPage(
            WizardForm.PageNameLabel.Caption, WizardForm.PageDescriptionLabel.Caption);
        ProgressPage.SetText('Doing something...', '');
        ProgressPage.SetProgress(0, Wait);
        ProgressPage.Show;
        try
          // instead of a fixed-length loop,
          // query your asynchronous process completion/state
          for I := 0 to Wait div Step do
          begin
            // pumps a window message queue as a side effect,
            // what prevents the freezing
            ProgressPage.SetProgress(I * Step, Wait);
            Sleep(Step);
          end;
        finally
          ProgressPage.Hide;
          ProgressPage.Free;
        end;
      end;
    end;
    

    这里的关键点是,SetProgress 调用会抽取一个窗口消息队列,以防止冻结。


    虽然实际上,您不想要固定长度的循环,而是使用不确定的进度条并在循环中查询 DLL 的状态。

    为此,请参阅Inno Setup: Marquee style progress bar for lengthy synchronous operation in C# DLL

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-03
      • 2023-01-31
      • 2011-12-16
      相关资源
      最近更新 更多