Ejecutar funcion en bucle cada X tiempo.

Iniciado por Kaxperday, 13 Julio 2015, 22:00 PM

0 Miembros y 1 Visitante están viendo este tema.

Kaxperday

Hola, tengo he probado a usar la función clock() pero claro, el valor de la misma es más grande cada vez, así pues tras pasar un segundo desde la primera llamada devolverá 1000, pues tras 48h, devolvería 48x60x60x1000=172.800.000 que no se si una variable podría almacenarlo un unsigned long, o si clock() sería capaz de devolverlo, pero la verdad es un valor muy grande. Lo que tengo es:

Código (cpp) [Seleccionar]

clock_t inicio= clock();
while(true)
{
   if(clock()-inicio>2000)
      inicio=clock();
      //ejecuto esto cada 2 segundos de bucle.
}


El problema es que clock() tomará valores muy grandes y puede ser peligroso para el programa, ¿no habrá una mejor forma de hacerlo?

Saludos.
Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.

ivancea96

#1
Te da para unos 49 días.

En cualquier caso, puedes usar time(), que hasta el año 2038, te funcionará sin problema xD
Claro que tratarás con segundos, no milisegundos.

Igualmente, ¿vas a tener un programa corriendo durante 50 días? Son caso 2 meses. Sin parar. Contando milisegundos durante 2 meses, es algo bruto. Utiliza segundos, o, si insistes, reinicia el programa cada X días (automaticamente, claro)

A todo esto, es recomendable que coloques algún sleep en el bucle, ya sea Sleep() de Windows, this_thread::sleep_for() de la estandar de C++11, o como veas.

Kaxperday

#2
http://www.cplusplus.com/reference/climits/

Para para, acabo de ver lo que es clock_t en la definición, y devuelve un long, no un u_long luego su máximo valor sería 2147483647, lo que daría para unas teniendo en cuenta que un día del bucle en ejecución daría lugar a un valor de 86400000.

Tendríamos como máximo 24,85 días en ejecución el bucle sin que casque el programa. Pero aún así es una vulnerabilidad, hay equipos que nunca se apagan.

Sino hay otro metodo mejor me conformare con ello, pero no me agrada como solución.

Estuve leyendo acerca de steady_clock pero creo que es igual que clock_t.

Saludos socio.
Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.

ivancea96

No creo que necesites tener sin parar un programa tanto tiempo, y haciendo comprobaciones exactas al milisegundo ._.

Si los intervalos son entre 100 y 1000 milisegundos, puedes utilizar sleep, que te dará una precisión medianamente fiable, especialmente si lo mezclas con time().

De cualquier forma, no te centres en factores que no te influyen :/

Kaxperday

La idea es usarlo para lanzar un reescaner de hosts en la red cada X tiempo. Pero claro quemara bastante CPU y además tomará valores muy grandes, no me gusta pero es lo que tengo, de todas formas no conozco a nadie que haya tenido encendido el ordenador 24,85 días XDDD

Saludos.
Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.

ivancea96

CitarLa idea es usarlo para lanzar un reescaner de hosts en la red cada X tiempo.

time()

Kaxperday

También lo pense, cogiendo la hora local, pero dificultaría mucho el código para obtener la diferencia de tiempos, la verdad lo estoy haciendo con clock() de todas formas lo apuntaré como posible mejora futura.

Saludos! gracias.
Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.

ivancea96

La hora locar funciona igual que clock ._.

Código (cpp) [Seleccionar]
time_t inicio = time(0);
while(true)
{
    if(time(0)-inicio>2)
        inicio=clock();
        //ejecuto esto cada 2 segundos de bucle.
}


¿La diferencia? Que con time, además de todo lo ya dicho, también sacas datos de año, mes, día, hora, minuto y segundo, objetivamente. Si vas a hacer diferencias por segundos y no por milisegundo, y quieres dejar tu programa un mes sin parar, yo lo tendría muy claro.