Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Kaxperday en 13 Julio 2015, 22:00 pm



Título: Ejecutar funcion en bucle cada X tiempo.
Publicado por: Kaxperday en 13 Julio 2015, 22:00 pm
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
  1. clock_t inicio= clock();
  2. while(true)
  3. {
  4.    if(clock()-inicio>2000)
  5.       inicio=clock();
  6.       //ejecuto esto cada 2 segundos de bucle.
  7. }

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

Saludos.


Título: Re: Ejecutar funcion en bucle cada X tiempo.
Publicado por: ivancea96 en 13 Julio 2015, 22:14 pm
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.


Título: Re: Ejecutar funcion en bucle cada X tiempo.
Publicado por: Kaxperday en 13 Julio 2015, 22:25 pm
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.


Título: Re: Ejecutar funcion en bucle cada X tiempo.
Publicado por: ivancea96 en 13 Julio 2015, 22:41 pm
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 :/


Título: Re: Ejecutar funcion en bucle cada X tiempo.
Publicado por: Kaxperday en 13 Julio 2015, 22:43 pm
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.


Título: Re: Ejecutar funcion en bucle cada X tiempo.
Publicado por: ivancea96 en 13 Julio 2015, 22:47 pm
Citar
La idea es usarlo para lanzar un reescaner de hosts en la red cada X tiempo.

time()


Título: Re: Ejecutar funcion en bucle cada X tiempo.
Publicado por: Kaxperday en 13 Julio 2015, 23:00 pm
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.


Título: Re: Ejecutar funcion en bucle cada X tiempo.
Publicado por: ivancea96 en 13 Julio 2015, 23:54 pm
La hora locar funciona igual que clock ._.

Código
  1. time_t inicio = time(0);
  2. while(true)
  3. {
  4.    if(time(0)-inicio>2)
  5.        inicio=clock();
  6.        //ejecuto esto cada 2 segundos de bucle.
  7. }

¿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.