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!
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.
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!
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");
}
}
Cita de: animanegra en 6 Marzo 2019, 10:55 AM
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 :-X
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!
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 :-X
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);
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
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 :-X
Maravilloso! Muchas gracias por la ayuda que he recibido!
Que pasen un buen día! =)