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á 🙂