Cómo evitar que se "congele" una aplicación en un proceso largo

4049 vistas

Dentro de grandes tratamientos en bucle, las ventanas de las aplicaciones no pueden ser refrescadas por Windows (efecto de congelación) mientras el proceso esté en curso. La solución radica en hacer una llamada al método Application.ProcessMessages de forma regular con el fin de tratar los mensajes de Windows. Esto también permitirá el programar un botón de "Stop" sin tener que recurrir al Ctrl+Alt+Sup.

En el código de ejemplo, la variable Stop indica que el botón "Stop" ha sido pulsado y que el proceso debe pararse. La llamada a Application.ProcessMessages permite de actualizar normalmente la ventana durante la ejecución del bucle.



delphi
  1. type
  2.   TForm1 = class(TForm)
  3.     ...
  4.   private
  5.     Stop : Boolean;
  6.     ...
  7.   end;
  8. ...
  9.  
  10. procedure TForm1.BoutonMarcheClick(Sender: TObject);
  11. Var
  12.   i: Integer;
  13. begin
  14.   { Poner a falso el Stop }
  15.   Stop := False;
  16.   I := 0;
  17.   { Tratamiento largo }
  18.   Repeat
  19.     Inc(i);
  20.     Label1.Caption := IntToStr(i);
  21.     { procesar mensajes de Windows }
  22.     Application.ProcessMessages;
  23.   Until (i >= 100000000) or Stop;
  24. end;
  25.  
  26. procedure TForm1.BoutonStopClick(Sender: TObject);
  27. begin
  28.   { pide la parada del bucle }
  29.   Stop := True;
  30. end;