2009-02-26 15 views
6

La larga Exec es la instalación de .NET 3.5, y el guión a cabo se basa fuera éste: http://www.blackhillsoftware.com/blog/2006/06/26/using-innosetup-with-the-dotnet-framework/¿Cómo se hace para que Inno Setup no parezca congelado mientras se realiza un Exec largo?

El problema es que se trata de utilizar "ewWaitUntilTerminated" porque tenemos que capturar el código de salida. Se ha empeorado por el hecho de que lo estamos ejecutando/pasivo/norestart para que sea menos trabajo por parte del usuario (¿Quizás no deberíamos?)

La opción más fácil que se me ocurre es ocultar el mientras está instalando .NET y mostrándolo nuevamente después de que está hecho, pero no estoy seguro de cómo hacerlo.

La solución ideal sería mostrar una página de progreso, pero no parece que sea posible, ya que tendríamos que volver de inmediato, pero de alguna manera aún recibir una notificación cuando el proceso finalice y capturar el código de salida de lo contrario, solo tendríamos una barra de progreso eterno.

¿Alguna idea sobre cómo hacerlo?

Editar: Minimizar probablemente sea mejor, pero no estoy seguro de cómo hacerlo. Mostramos un mensaje que informa al usuario que el proceso puede tomar de 10 a 20 minutos, sin embargo, el problema es que el formulario de configuración principal está completamente congelado, no se puede mover, minimizar o hacer nada con él. También en ejecución/pasivo, el instalador de .NET no muestra ningún progreso durante un buen minuto o dos en una máquina más lenta.

+0

Después de haber pasado una tarde instalando una demostración de una aplicación que no comenzó advirtiéndome que querría .NET 3.5 hasta después del primer reinicio obligatorio ... digamos que los usuarios pueden ponerse irritados por un largo inesperado subinstalaciones. Sin embargo, no tengo una respuesta técnica. – RBerteig

+0

Luego .NET también requirió un reinicio, después de lo cual la configuración de la aplicación original se olvidó de que se estaba ejecutando, y se tuvo que encontrar manualmente en una carpeta temporal y volver a ejecutar para instalar la aplicación. – RBerteig

+0

Sí, informamos a ese usuario y les permitimos cancelar antes de que se instale el marco, y suprimimos el reinicio del instalador .net y lo capturamos en el código de retorno para reiniciar nosotros mismos – Davy8

Respuesta

0

que hemos necesitado para instalar .NET con un par de productos, y han adoptado dos enfoques:

  • Al instalar .NET con InnoSetup, dejamos que el usuario sepa que la instalación va a tomar mucho tiempo, y esperar un cierto mensaje cuando esté completo
  • Comenzamos la configuración de .NET sin ninguna marca para forzar al cliente a pasar por ella. De esta forma, si están más inclinados técnicamente, saben por qué la instalación tarda tanto.

Honestamente, hemos tenido más suerte con la segunda opción, especialmente ahora que más administradores de sistemas parecen bloquear los equipos de escritorio a un cierto la licenciatura.

+0

Sí, actualmente estamos utilizando el primer enfoque, y considerando el segundo, pero nos preguntamos si existe una mejor solución – Davy8

2

Aunque probablemente sería fácil, no recomiendo ocultar el instalador mientras se ejecuta el instalador .Net. He visto a otros instaladores hacer eso, y cuando sucede, creo que la instalación ha finalizado, y luego estoy confundido cuando descubro que realmente no es así. (Y cuando la instalación realmente está terminada, tampoco puedo estar seguro de eso. Tal vez se haya escondido de nuevo.)

Puede mostrar páginas personalizadas en el asistente de instalación de Inno. Hacer que dicha página muestre una barra de progreso y mantenerla precisa probablemente sea un desafío, pero al menos podría mostrar un mensaje en la página del asistente que indique que su instalador está esperando el instalador .Net antes de continuar. Consulte la sección "Uso de páginas de asistente personalizadas" del archivo de ayuda.

+0

Tenemos algo similar que eso, sin embargo, el Exec se ejecuta en el mismo subproceso, por lo que el usuario no puede mover, cambiar el tamaño, minimizar o hacer nada con el formulario de instalación. – Davy8

+0

(Personalmente pensé que estaba bien, pero mi jefe se quejó e insistió en que era inaceptable) – Davy8

+1

@ Davy8: Su primer comentario no es del todo cierto: se ejecuta en el mismo hilo, pero se llama a Application.ProcessMessages(). Sin embargo, la forma del asistente está desactivada, por lo que no es posible mover, cambiar el tamaño, etc. – mghie

2

Simplemente puede ocultar el formulario asistente de instalación llamando

WizardForm.Hide; 
Exec(...); 
WizardForm.Show; 

aunque estoy de acuerdo que esto no es muy bonita.

0

Han pasado 5 años desde que hizo la pregunta pero esta es mi respuesta de todos modos.

Antes de llamar a Exec() se puede establecer el mensaje que se muestra mediante la disposición de Inno por encima de la barra principal progreso de esta manera:

WizardForm.StatusLabel.Caption := 'Installing .NET Framework 3.5. Please wait, this can take up to 1 hour...'; 
+0

Excepto que también puede ['mostrar una barra de progreso de marquesina'] (http://stackoverflow.com/a/20753218/960757). Además, debe almacenar el título de 'StatusLabel' y restaurarlo cuando lo cambie. – TLama

7

Una forma de hacer InnoSetup "no se ven congelado" es añadir una indicador de progreso "falso", como una marquesina, para mostrar que algo está sucediendo. Pero esto no resolverá el problema de "ventana no dragable/móvil".

Por lo tanto, otra forma es para descongelar realmente la GUI InnoSetup, mientras se ejecuta un proceso de larga duración:

El "proceso de larga ejecución" se ejecuta a través de ShellExecuteEx(). Luego, el instalador usa un ciclo while con la condición WaitForSingleObject y un tiempo de espera mínimo de para ejecutar AppProcessMessage.

AppProcessMessage es en sí mismo una función de ayuda. Utiliza el código "genérico" para recrear un procedimiento "Application.ProcessMessages" -ish, utilizando la función WinAPI PeekMessage(), TranslateMessage() y DispatchMessage(). Su trabajo es ser la bomba de mensajes a InnoSetup GUI.

Este truco hace que la ventana responda/dragable nuevamente, mientras que el "proceso de larga ejecución" se procesa en segundo plano.

Esta es la fuente para el bucle de ejecución:

if ShellExecuteEx(ExecInfo) then 
    begin 
    while WaitForSingleObject(ExecInfo.hProcess, 100) = WAIT_TIMEOUT 
    do begin 
     AppProcessMessage; 
     WizardForm.Refresh(); 
    end; 
    CloseHandle(ExecInfo.hProcess); 
    end; 

La siguiente GIST para unzip.iss contiene el código para un independiente Unzip Helper for executing 7zip without blocking the InnoSetup GUI, incluyendo las partes y piezas para trabajar con la función AppProcessMessage.

En este caso, "descomprimir" es solo un ejemplo y puede reemplazar la aplicación ejecutada con lo que sea, un instalador .Net o cualquier otra tarea de larga ejecución.

+1

¡esta es la respuesta correcta! – QbProg

+1

Hermoso, gracias por esto! – Iguananaut

Cuestiones relacionadas