Jump to content


Photo

[RESUELTO] Esperar el tiempo real


  • Please log in to reply
5 replies to this topic

#1 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4483 posts
  • LocationVenezuela

Posted 22 April 2011 - 06:39 AM

Hola a todos, tengo una aplicacion que realiza una serie de procesos, pero entre cada proceso debo esperar exactamente tres minutos, lo que hago es lo siguiente para que no se vea congelada:




delphi
  1. nEspera := 0;
  2.               while nEspera <= 90000 do
  3.               begin
  4.                     sleep(2);
  5.                     Application.ProcessMessages;
  6.                     inc(nEspera);
  7.               end;





El asunto es que mientras mas procesos se esten ejecutando menos exactos son esos tres minutos, incluso hasta 5 minutos pasan entre procesos.


Que otra forma se les ocurre para hacer este proceso mas exacto???


Gracias por las respuestas
  • 0

#2 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6301 posts
  • LocationArgentina

Posted 22 April 2011 - 10:43 AM

Hola Eduardo,

¿Está o evaluaste la posibilidad de que esos procesos se ejecuten en hilos separados? Esto se podría ayudar a independizar y poder sincronizar los procesos.
El uso de Timers es otra posibilidad. Ya sea que lo hagas con el propio componente que ofrece Delphi o la propia API: SetTimer. Aunque si la idea es obtener mayor precisión parece ser que debe jugarse con otras APIs como TimeBeginPeriod, TimeEndPeriod, y TimeSetEvent.

No he jugado con esas APIs por lo que no sabría decirte mucho.

De todas formas sea cual fuese la alternativa que utilices, siempre habrá una perdida de precisión... no se puede garantizar de que se cumpla exactamente el tiempo indicado entre uno y otro. Hay factores externos y ajenos a nuestros desarrollos que inciden.

Saludos,
  • 0

#3 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1484 posts
  • LocationMallorca

Posted 22 April 2011 - 12:13 PM

Como dice Delphius, lo más sencillo es que utilices un Timer programado para que salte a los tres minutos. De esta forma tu aplicación no quedará bloqueada (puesto que nunca llamas a Sleep()), y la espera de tres minutos será lo más precisa posible.

El componente Timer se encuentra en la pestaña System.

Saludos.
  • 0

#4 seoane

seoane

    Advanced Member

  • Administrador
  • 1259 posts
  • LocationEspaña

Posted 23 April 2011 - 02:46 AM

A mi se me ocurre que puedes hacer algo como esto:


delphi
  1. var
  2.   Ticks: Cardinal;
  3. begin
  4.   Ticks:= GetTickCount;
  5.   while GetTickCount - Ticks < 180000 do
  6.     Application.ProcessMessages;
  7. end;




Recuerda que la función Sleep es muy poco precisa en cuanto al tiempo, sobre todo en tiempo muy pequeños, ya que depende de la precisión del reloj interno del ordenador.


The system clock "ticks" at a constant rate. If dwMilliseconds is less than the resolution of the system clock, the thread may sleep for less than the specified length of time. If dwMilliseconds is greater than one tick but less than two, the wait can be anywhere between one and two ticks, and so on. To increase the accuracy of the sleep interval, call the timeGetDevCaps function to determine the supported minimum timer resolution and the timeBeginPeriod function to set the timer resolution to its minimum. Use caution when calling timeBeginPeriod, as frequent calls can significantly affect the system clock, system power usage, and the scheduler. If you call timeBeginPeriod, call it one time early in the application and be sure to call the timeEndPeriod function at the very end of the application.









  • 0

#5 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4483 posts
  • LocationVenezuela

Posted 23 April 2011 - 08:29 AM

Gracias a todos por su colaboración, la solución que mas se adapta es la seoane ya que tomo el tick antes de hacer el proceso. Lo que quiere decir que el rpoximo se inicia tres minutos justos despues de haber comenzado el anterior.

Doy el caso como resuelto.
  • 0

#6 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6301 posts
  • LocationArgentina

Posted 23 April 2011 - 10:25 PM

Hola,

Yo también había pensado en el uso de Ticks pero no me parece una buena opción la de emplear un ciclo para simular un "despertador" cuando hay otras opciones a la mano y que están, supuestamente, preparadas para ello.

Domingo, ya que estás por aquí, tengo una duda relacionado con el Timer de la API y los Ticks. ¿Que no se basa el S.O, ya de por sí internamente, en los ticks para el manejo de Timers?

Saludos,
  • 0




IP.Board spam blocked by CleanTalk.