Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Espera larga en bucle while (https://www.clubdelphi.com/foros/showthread.php?t=83519)

mosco 26-06-2013 18:02:06

Espera larga en bucle while
 
¿Se puede estar mucho tiempo en un bucle while a la espera?.
Lo he probado y el programa se cuelga.

Necesito esperar cerca de un minuto a que se cumpla una condición y luego seguir ejecutando el codigo.

¿Hay alguna forma simple de hacerlo?.

Saludos.

Neftali [Germán.Estévez] 26-06-2013 18:41:03

Utiliza un TTimer.
De esa forma además no bloquearás el programa.

Le asignas el Interval a 60000, lo activas y cuando pasen 60 segundos "saltará" el evento OnTimer. Ahí puedes programar lo que necesites.

ecfisa 26-06-2013 18:58:27

Hola mosco.

Estoy de acuerdo con Neftali, es la elección más apropiada.

Ahora, si por algún motivo necesitas "congelar" la aplicacion por x tiempo podes hacer:
Código Delphi [-]
procedure WaitMinute(Lapso: Single);
var
  t1, t2: TTime;
begin
  t1  := Time;
  while (t2-t1)*1440 <= Lapso do
    t2 := Time;
end;

Llamadas:
Código Delphi [-]
begin
   WaitMinute(1); // 1 min.
   WaitMinute(.5); // 30 seg.
   ...

Saludos. :)

mosco 26-06-2013 19:17:00

Muchas gracias a ambos. Me ha solucionado muchisimo.

Saludos.

nlsgarcia 27-06-2013 03:24:54

mosco,

Cita:

Empezado por mosco
...¿Se puede estar mucho tiempo en un bucle while a la espera?...Lo he probado y el programa se cuelga...

En términos absolutos Si, en términos relativos depende de los requerimientos de la aplicación.

Como se menciono en el Msg #2 el uso del control TTimer permite de forma eficiente programar la ejecución de tareas en un intervalo de tiempo determinado, sin embargo también es posible hacerlo mediante una técnica denominada Espera Activa.

Revisa este código:
Código Delphi [-]
procedure WaitInterval(Lapse : LongWord);
var
   Start, Stop : Cardinal;

begin

   Start := GetTickCount;
   Repeat
      Stop := GetTickCount;
      Application.ProcessMessages;
      Sleep(10); // Evita el alto consumo de CPU por la técnica de Espera Activa.
   until (Stop - Start) >= Lapse;

end;

procedure TForm1.Button1Click(Sender: TObject);
begin

   WaitInterval(60000);

   // El código que se requiera ejecutar luego de haber transcurrido un lapso de 60000 ms = 1 min, Ejm: ShowMessage.
   ShowMessage('Fin de WaitInterval');

end;
El código anterior permite ejecutar un proceso luego de haber transcurrido 1 minuto sin bloquear la aplicación, puede ser útil como complemento del Procedure Sleep.

Espero sea útil :)

Nelson.


La franja horaria es GMT +2. Ahora son las 09:12:21.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi