Autor
|
Tema: Cómo hacer para que un código de C++ se ejecute cada X tiempo automáticamente (Leído 6,659 veces)
|
nadales56
Desconectado
Mensajes: 23
|
Buenos días, gracias de antemano por leer el post.
Me gustaría saber cómo puedo hacer que un código que tengo implementado se ejecute automáticamente cada 5 min, por ejemplo.
Muchas gracias, un saludo!
|
|
|
En línea
|
|
|
|
animanegra
Desconectado
Mensajes: 287
|
Si quires ejecutar el codigo y que este sea el que ejecute la acción debes usar gettimeofday y sleep. Tomas el tiempo antes de un bucle y en el bucle compruebas si el tiempo que ha pasado han sido mas de X segundos (por ejemplo 300). Despues de eso ejecutas la acción que quieras y metes todo el proceso en un bucle infinito.
Si no quieres que se quede el programa en ejecución en windows tendrás que ponerlo en tareas programadas, o en caso de usar un linux pues en el cron.
|
|
|
En línea
|
 42 No contesto mensajes por privado, si tienes alguna pregunta, consulta o petición plantéala en el foro para que se aproveche toda la comunidad.
|
|
|
nadales56
Desconectado
Mensajes: 23
|
Muchas gracias por responder animanegra! Lo cierto es que soy un poco manco a la hora de programar, y creo que he entendido lo que me has escrito.
Echaré un vistazo e iré probando. Un saludo!
|
|
|
En línea
|
|
|
|
animanegra
Desconectado
Mensajes: 287
|
Escribiendo el código así sin comprobar y en c estructurado seria algo asi (no se ni si compila): #include <time.h> #include <sys/time.h> #include <stdlib.h> #include <stdio.h>
main(){
struct timeval inicio,tiempo;
while(1==1){
gettimeofday(&inicio, NULL); gettimeofday(&tiempo, NULL);
while(tiempo.tv_sec-inicio.tv_sec < 300){
gettimeofday(&tiempo, NULL);
sleep(1);
}
printf("imprimiendo basura cada 300 segundos!!!\n");
}
}
|
|
|
En línea
|
 42 No contesto mensajes por privado, si tienes alguna pregunta, consulta o petición plantéala en el foro para que se aproveche toda la comunidad.
|
|
|
K-YreX
|
Escribiendo el código así sin comprobar y en c estructurado seria algo asi (no se ni si compila): #include <time.h> #include <sys/time.h> #include <stdlib.h> #include <stdio.h>
main(){
struct timeval inicio,tiempo;
while(1==1){
gettimeofday(&inicio, NULL); gettimeofday(&tiempo, NULL);
while(tiempo.tv_sec-inicio.tv_sec < 300){
gettimeofday(&tiempo, NULL);
sleep(1);
}
printf("imprimiendo basura cada 300 segundos!!!\n");
}
}
Un bucle <while> infinito se puede hacer simplemente con un 1 igual que se puede hacer sólo con <true>: while(1){ // cuerpo del bucle infinito }
Y la otra pregunta que me surge es... Si desde un principio sabes el tiempo que tienes que esperar ¿por qué no así? while(1){ Sleep(milisegundos_a_esperar); // lo que quieres que se repita }
Lo malo de esta forma (tanto con una implementación como con la otra) es que el programa tiene que estar siempre ejecutándose; como ya te ha comentado @animanegra, es preferible dejarlo como tarea programa usando herramientas externas al propio programa. Suerte 
|
|
|
En línea
|
cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
|
|
|
nadales56
Desconectado
Mensajes: 23
|
Muchísimas gracias por responder!! ya he conseguido resolver el problema, y me funciona a la perfección. do{ cout << "========== C H E C K I N G - " << cont << " =========="<<endl; entrada = "Fichero_Origen.txt"; salida = "Fichero_Destino.txt"; traspasar_fichero(salida, entrada, ok1); codigo_error(ok1); entrada = "Fichero_Destino.txt; salida = "Datos_Actualizados.txt"; actualizar_datos(salida, entrada, ok2); codigo_error(ok2); if(ok1 == OK_traspaso && ok2 == OK_dato){ continuo = true; }else{ continuo = false; } cont++; cout << "= = = = = = = = = = = = = = = = = = = = =" << endl; cout << endl; Sleep(300000); }while(continuo = true);
La duda que tengo ahora es si lo que tengo hecho es algo muy basto o si hay alguna mejora que podría hacerle. ¿cómo hago para dejarlo como tarea programa? en qué beneficiaría exactamente que el código no estuviese siempre ejecutándose? Un saludo y muchas gracias!
|
|
|
En línea
|
|
|
|
K-YreX
|
Tienes un error en ese código... Si te fijas nunca vas a salir del <while> ya que no estás comparando <continuo> con <true> sino que estás asignando <true> a la variable <continuo> (ya que sólo estás usando un =). Si el propósito es ese, un bucle infinito, entonces es innecesario eso; y si el objetivo no es ese tienes que corregir esa condición... Además te has dejado unas comillas al final de <entrada = "Fichero_Destino.txt">.
Y hombre un poco basto sí que es... Tener el programa continuamente en ejecución, primero; te está consumiendo recursos del pc y luego que podrías cerrarlo por error y perder toda la progresión. Para establecerlo como una tarea programada tienes que buscarlo según el sistema operativo (que en tu caso imagino que es Windows). Suerte  Y ahora por añadir algo más te dejo otra opción para ese tipo de condicionales con una variable <bool>: if(ok1 == OK_traspaso && ok2 == OK_dato){ continuo = true; }else{ continuo = false; } // FORMA EQUIVALENTE A LA DE ARRIBA bool continuo = (ok1 == OK_traspaso && ok2 == OK_dato);
|
|
|
En línea
|
cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
|
|
|
nadales56
Desconectado
Mensajes: 23
|
Tienes razón, ese continuo = true está mal, claro, como me funcionaba pues ni me he fijado, y al ser también un indicativo de si el proceso ha ido bien, pues el == es lo que hay que poner. Muchas gracias!
Entonces, si recurro al programador de tareas del PC y mando que esa tarea se ejecute cada 5 min automáticamente, no sería necesario usar los comandos Sleep y demás no?
Agradezco mucho vuestras respuestas! un saludo
|
|
|
En línea
|
|
|
|
K-YreX
|
No, no es necesario el <Sleep()> ya que eso lo hemos incluido ahora para mantener el programa "dormido" durante X tiempo aunque esté siempre ejecutándose. Pero si se programa cada X tiempo, entonces el programa terminará una vez y cuando pase X, volverá a ejecutarse. Suerte 
|
|
|
En línea
|
cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
|
|
|
nadales56
Desconectado
Mensajes: 23
|
Maravilloso! Muchas gracias por la ayuda que he recibido! Que pasen un buen día! =)
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
hacer que un exe se ejecute solo en determinado tiempo?
Programación Visual Basic
|
koopa2
|
3
|
4,092
|
10 Noviembre 2006, 13:48 pm
por Gorky
|
|
|
Automatizar algo para que se ejecute automáticamente en el servidor
Desarrollo Web
|
lipman
|
5
|
6,052
|
10 Mayo 2011, 21:01 pm
por el-brujo
|
|
|
[Resuelto] como puedo hacer que cambie las imágenes cada x tiempo¿?
Desarrollo Web
|
xGENiiiuS
|
3
|
3,299
|
23 Enero 2016, 23:11 pm
por xGENiiiuS
|
|
|
¿Como puedo hacer un script para cambiar mi ip cada cierto tiempo?
Redes
|
Woody909
|
5
|
4,797
|
20 Julio 2017, 15:30 pm
por ThinkByYourself
|
|
|
Como abrir una terminal y que esta ejecute script automáticamente
GNU/Linux
|
Sergiolocuelo
|
5
|
4,790
|
21 Septiembre 2018, 18:34 pm
por Sergiolocuelo
|
|