Test Foro de elhacker.net SMF 2.1

Programación => Programación C/C++ => Mensaje iniciado por: nadales56 en 6 Marzo 2019, 09:07 AM

Título: Cómo hacer para que un código de C++ se ejecute cada X tiempo automáticamente
Publicado por: nadales56 en 6 Marzo 2019, 09:07 AM
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!
Título: Re: Cómo hacer para que un código de C++ se ejecute cada X tiempo automáticamente
Publicado por: animanegra en 6 Marzo 2019, 09:21 AM
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.
Título: Re: Cómo hacer para que un código de C++ se ejecute cada X tiempo automáticamente
Publicado por: nadales56 en 6 Marzo 2019, 09:47 AM
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!
Título: Re: Cómo hacer para que un código de C++ se ejecute cada X tiempo automáticamente
Publicado por: 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");

   }

}
Título: Re: Cómo hacer para que un código de C++ se ejecute cada X tiempo automáticamente
Publicado por: K-YreX en 6 Marzo 2019, 16:55 PM
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
Título: Re: Cómo hacer para que un código de C++ se ejecute cada X tiempo automáticamente
Publicado por: nadales56 en 7 Marzo 2019, 08:17 AM
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!
Título: Re: Cómo hacer para que un código de C++ se ejecute cada X tiempo automáticamente
Publicado por: K-YreX en 7 Marzo 2019, 13:00 PM
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);
Título: Re: Cómo hacer para que un código de C++ se ejecute cada X tiempo automáticamente
Publicado por: nadales56 en 8 Marzo 2019, 08:43 AM
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
Título: Re: Cómo hacer para que un código de C++ se ejecute cada X tiempo automáticamente
Publicado por: K-YreX en 8 Marzo 2019, 08:47 AM
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
Título: Re: Cómo hacer para que un código de C++ se ejecute cada X tiempo automáticamente
Publicado por: nadales56 en 8 Marzo 2019, 08:57 AM
Maravilloso! Muchas gracias por la ayuda que he recibido!
Que pasen un buen día! =)