Llame a la función periódicamente sin utilizar hilos y el método sleep () en c

Quiero llamar a una función, digamos cada 10 o 20 segundos. Cuando busqué, se me ocurrieron hilos y el método sleep() todas partes.

También revisé las clases de tiempo y reloj en C, pero no pude encontrar nada útil específico para mi pregunta.

¿Cuál es la forma más sencilla de llamar funciones periódicamente?

Usar libevent , en mi opinión, es la solución más limpia porque, mientras tanto, puedes hacer otras operaciones (incluso otras funciones cronometradas)

mire este ejemplo simple y autoexplicativo que imprime Hola cada 3 segundos:

 #include  #include  #include  void say_hello(int fd, short event, void *arg) { printf("Hello\n"); } int main(int argc, const char* argv[]) { struct event ev; struct timeval tv; tv.tv_sec = 3; tv.tv_usec = 0; event_init(); evtimer_set(&ev, say_hello, NULL); evtimer_add(&ev, &tv); event_dispatch(); return 0; } 

La mayoría de los sistemas operativos tienen una forma de “progtwigr una alarma” o “configurar un temporizador”, que llamará a una función suya en un momento dado en el futuro. En Linux, SetTimer alarm , en Windows SetTimer .

Estas funciones tienen restricciones sobre lo que puede hacer en la función a la que se llama, y ​​es casi seguro que terminará con algo que tiene varios subprocesos al final de todos modos, aunque el subproceso no esté llamando al modo de sleep , sino que en lugar de wait_for_event , algunos wait_for_event una función similar. .

Edición: Sin embargo, utilizando un hilo con un hilo que contiene:

 while(1) { sleep(required_time); function(); } 

El problema se resuelve de una manera muy directa para resolver el problema y lo hace muy fácil de manejar.

Una solución ingenua sería algo como esto:

 /* Infinite loop */ time_t start_time = time(NULL); for (;;) { time_t now = time(NULL); time_t diff = now - start_time; if ((diff % 10) == 0) { /* Ten seconds has passed */ } if ((diff % 20) == 0) { /* Twenty seconds has passed */ } } 

Es posible que desee un indicador que indique si se ha llamado a la función, o se llamará varias veces durante un segundo (diff % 10) == 0 es verdadero.

Prueba esto:

 while(true) { if(System.getNanotime % 20 == 0) { myFunction(); } } 

Esto está en Java-Sintaxis, no programé c desde hace más de 5 años, pero quizás te ayude 🙂

Sencillo:

 #include  #include  int main(int argc, const char** argv) { while(1) { usleep(20000) ; printf("tick!\n") ; } } 

Tenga en cuenta que usleep () por supuesto bloqueará 🙂