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:
//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) {}
}
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):
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:
//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;
}
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.
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