2016-10-03 7 views
1

Привет, мне нравится знать, как я могу задержать работу (или команду) в течение определенного времени в Inno Setup Pascal Script.Как задержать без замораживания - Inno Setup

Встроенный 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, но не могу думать, как использовать его в своей функции.

Мне нравится знать, как я могу использовать WaitForSingleObject в этом SleepEx Функция.

Благодарим за помощь.

+0

Какую «работу» вы хотите отложить? «WaitForSingleObject» не поможет предотвратить замораживание. В чем разница между безусловным и зависанием? –

+0

ОК. Разница заключается в том, что WizardForm не является активным окном при использовании 'Sleep', но при использовании' SleepEx' он все еще является активным окном, но зависает. :-( – Blueeyes789

+0

Я хочу отложить команду 'ssPostInstall' :-( – Blueeyes789

ответ

1

Используйте настраиваемую страницу прогресса (The 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 вызов накачивает очереди сообщений окна, то, что предотвращает замерзание.

enter image description here


Хотя на самом деле, вы не хотите, чтобы цикл фиксированной длины, вместо того, чтобы использовать неопределенный индикатор выполнения и запрос DLL в цикле для его статуса.

Для этого см. Inno Setup: Marquee style progress bar for lengthy synchronous operation in C# DLL.