Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Timer

Estas en el tema de Timer en el foro de C/C++ en Foros del Web. Hola, cómo se implementa un TIMER en c? Una duda, cuando acaba el timer, cómo me avisa de que ha terminado?...
  #1 (permalink)  
Antiguo 24/10/2012, 01:01
 
Fecha de Ingreso: julio-2010
Mensajes: 216
Antigüedad: 14 años, 5 meses
Puntos: 0
Timer

Hola, cómo se implementa un TIMER en c?

Una duda, cuando acaba el timer, cómo me avisa de que ha terminado?
  #2 (permalink)  
Antiguo 24/10/2012, 13:19
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 12 años, 4 meses
Puntos: 83
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:
//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
  #3 (permalink)  
Antiguo 29/10/2012, 05:30
 
Fecha de Ingreso: julio-2010
Mensajes: 216
Antigüedad: 14 años, 5 meses
Puntos: 0
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: time
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 18:24.