Hola, cómo se implementa un TIMER en c?
Una duda, cuando acaba el timer, cómo me avisa de que ha terminado?
| |||
Respuesta: Timer Un timer sincrono o un timer asincrono? En ambos casos el funcionamiento interno es un contador que finaliza cuando se cumple el tiempo indicado. El timer sincrono bloquea la aplicacion hasta que finaliza (mas concretamente se llama un sleep), no necesita informar a la aplicacion que ha terminado (basicamente es un bucle) y necesariamente finaliza al finalizar la condicion de lapso de tiempo (de lo contrario bloquearia la aplicacion indefinidamente). El timer asincrono es un proceso paralelo (no bloquea la aplicacion), y al cumplir el lapso de tiempo avisa a traves de un puntero a una funcion (o una funcion global, o si estas en windows a traves de un mensaje al handler de la ventana que lo ejecutó). Este tipo de timer puede comportarse como un timeout (una sola condicion de tiempo y una sola notificacion a la aplicacion) o como un intervalo (pasado un lapso 'l' sobre un tiempo 't' notifica a la aplicacion y reinicia asignando el nuevo tiempo como tiempo anterior 't' mas lapso 'l', haciendo un bucle infinito pero que no bloquea la aplicacion porque es un proceso paralelo). Este tipo de timers puede llevar un 'flag' para detenerlo desde fuera en caso necesario. Ambos tipos de timer estan implementados en la API de windows, para otros s.o. lo desconozco pero supongo que tambien ya que el C estandar no proporciona este tipo de funcionalidad (al menos eso es lo que tengo entendido). Aquí te dejo un ejemplo de como implementar un timer sincrono (uno llamando a la api de windows y el otro usando c estandar):
Código:
Y tambien te dejo un ejemplo para un timer de intervalo asincrono para windows (la llamada a la funcion de inicio varia un poco entre los threads de process y la del api de windows)://sleep de la api de windows Sleep(milisegundos); //sleep de c estandar void sleep(double segundos) { time_t start = clock(); while((clock()-start) < segundos*CLOCKS_PER_SEC) {} }
Código:
//estructura de intercambio de datos struct TIMEOUTDATA { int segundos; void(*funcion)(); }; //flag de estado static char flag = 0; //funcion creada por multithread void timeout(void *lpvoid) { struct TIMEOUTDATA td= *(struct TIMEOUTDATA*)lpvoid; flag = 1; while(flag) { time_t start = clock(); while((clock()-start) < td.segundos*CLOCKS_PER_SEC) {} td.funcion(); } } //funcion de notificacion void timeout_tick() { printf("TICK"); } //inicializacion de estructura de intercambio de datos desde el main struct TIMEOUTDATA td; td.segundos = 1; td.funcion = timeout_tick; //llamada al timer _beginthread(timeout, 0, &td); Si estas usando el modo grafico de windows puedes hacer lo mismo que en las funciones anteriores (solo que la estructura de intercambio de datos llevará el handler de la instancia que ejecuto el proceso), pero es mejor usar el timer de la api, te dejo un ejemplo:
Código:
Solo he puesto las lineas referidas al caso, si no estas familiarizado con el modo grafico de windows no creo que te aporte nada este ultimo codigo.//la llamada de inicio int milisegundos = 1000; SetTimer(hwnd, IDENTIFICADOR_TIMER, milisegundos, 0); //recibo de la notificacion en el proceso principal de hwnd switch(msg) {//escanea los mensajes recibidos en el bucle de la aplicacion case WM_TIMER: { switch(wParam) {//el wParam lleva el identificador del timer que lo ha lanzado case IDENTIFICADOR_TIMER: { //ya lo tienes } break; } } break; } Para que quieres exactamente el timer? Si acotas un poco el ambito de tu duda seguramente alguien podrá echarte una mano en algo contreto en vez de todas estas ideas que te he propuesto. Saludos vosk |
| |||
Respuesta: Timer Muchas gracias por la respuesta. Se trata de un timer asíncrono, la aplicación debe seguir hasta que se alcancen los cilcos de reloj del timer. Un proceso se encargan de ir chequeando todos los timers de la aplicación cada cierto tiempo. Ya está solucionado. Un saludo y muchas gracias otra vez. |
Etiquetas: |