Cómo hacer para que un código de C++ se ejecute cada X tiempo automáticamente

Iniciado por nadales56, 6 Marzo 2019, 09:07 AM

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

nadales56

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!

animanegra

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.

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

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!

animanegra

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");

   }

}

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

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>:
Código (cpp) [Seleccionar]

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í?
Código (cpp) [Seleccionar]

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
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;

nadales56

Muchísimas gracias por responder!!
ya he conseguido resolver el problema, y me funciona a la perfección.

Código (cpp) [Seleccionar]
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!

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 :-X

Y ahora por añadir algo más te dejo otra opción para ese tipo de condicionales con una variable <bool>:
Código (cpp) [Seleccionar]

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);
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;

nadales56

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

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 :-X
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;

nadales56

Maravilloso! Muchas gracias por la ayuda que he recibido!
Que pasen un buen día! =)