PDA

Ver la Versión Completa : Espera larga en bucle while


mosco
26-06-2013, 18:02:06
¿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:

procedure WaitMinute(Lapso: Single);
var
t1, t2: TTime;
begin
t1 := Time;
while (t2-t1)*1440 <= Lapso do
t2 := Time;
end;


Llamadas:

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,


...¿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 (http://es.wikipedia.org/wiki/Espera_activa).

Revisa este código:

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 (http://delphi.about.com/library/rtl/blrtlSleep.htm).

Espero sea útil :)

Nelson.