Lo que debes controlar no es el tiempo, sino el número de pasos que realiza el procedimiento. No sé cómo se puede hacer esto dentro de InnoSetup pero, basándome en tu código, el algoritmo sería así (más o menos):
Código Delphi
[-]
CONST
NumPasos = Número de pasos que realice;
BEGIN
MsgBox('false', mbInformation, MB_OK);
ProgressPage := CreateOutputProgressPage ('My App','');
ProgressPage.SetText ('Starting installation...', '');
ProgressPage.SetProgress (0, 0);
ProgressPage.Show;
TRY
FOR I := 1 TO NumPasos DO
BEGIN
RealizaPaso (I);
ProgressPage.SetProgress (I, NumPasos);
END;
FINALLY
ProgressPage.Hide;
ProgressPage.Free;
END;
END;
Es decir, no espera un tiempo, sino que espera a que se realice cada paso.
Si se usan distintos hilos de ejecución (que es lo que parece), entonces necesitarás una variable global que el procedimiento de instalación deberá ir actualizando. En ese caso, el bucle sería diferente:
Código Delphi
[-]
CONST
NumPasos = Número de pasos que realice;
VAR
PasoActual: INTEGER;
...
BEGIN
MsgBox('false', mbInformation, MB_OK);
ProgressPage := CreateOutputProgressPage ('My App','');
ProgressPage.SetText ('Starting installation...', '');
ProgressPage.Show;
TRY
REPEAT
ProgressPage.SetProgress (PasoActual, NumPasos);
Sleep (1000);
UNTIL PasoActual > NumPasos;
FINALLY
ProgressPage.Hide;
ProgressPage.Free;
END;
END;
Como ves, aquí sí es necesario un Sleep para evitar la saturación de la UCP. Por otro lado, el procedimiento que realiza la actualización debe contar los pasos desde 1, no desde 0, y asignarle un valor mayor a NumPasos para indicar que ya ha terminado de realizar el trabajo.
Espero que te sirva.