2009-09-17 12 views

Respuesta

7

Eche un vistazo a la función SetTimer.

UINT_PTR timerid = SetTimer(NULL, 0, milliseconds, &callback); 
+0

... Si se trata de una aplicación Win32 C con ventana. – Kieveli

+4

Sí, debe tener un bucle de mensaje. No necesita tener ventanas, sin embargo. – avakar

+0

@avakar Entonces, si ocurre algún evento, necesito reiniciar el temporizador. ¿Cómo puedo conseguir esto? – Sorcrer

0

Los temporizadores no son parte del lenguaje C.

Debe consultar la documentación del entorno de programación que esté utilizando para averiguar cómo usar los temporizadores. Como no ha indicado qué entorno, no es posible responder a su pregunta.

+1

La plataforma es Windows. – Vidya

0

Si usted está dispuesto a abordar WIN32 Thread Pools, puede utilizar temporizadores grupo de subprocesos.

Un grupo de subprocesos es una colección de subprocesos de trabajo que ejecutan de manera eficiente devoluciones de llamada asincrónicas en nombre de la aplicación. El grupo de subprocesos se usa principalmente para reducir el número de subprocesos de aplicación y proporcionar administración de los subprocesos de trabajo. Las aplicaciones pueden poner en cola los elementos de trabajo, asociar el trabajo con identificadores que se pueden usar de forma segura, hacer cola automáticamente en el según un temporizador y enlazar con E/S.

Una parte de esta API, ver

CreateTimerQueueTimer Function

Crea un temporizador temporizador-cola. Este temporizador expira a la hora especificada, luego después de cada período especificado. Cuando el temporizador expira, se llama a la función de devolución de llamada.

0

Si no necesita hacer nada más en su aplicación, puede usar la función sleep(). Permitirá que la ejecución continúe y luego reanudará la ejecución del código después de que haya expirado la duración especificada (ish).

En Windows, solíamos usar una función de temporizador multimedia si quería dormir por intervalos de menos de un segundo. Algunos otros métodos dependen de la plataforma.

También he oído hablar de personas que usan 'select()' como método de dormir durante mili/micro segundos.

Si necesita que ocurran otras cosas, desea utilizar el comando sleep/select dentro de un segundo hilo.

Aquí hay un Google Library for doing high resolution timing también. Podría ayudar.

+0

+1 porque me gustó la referencia de google. –

0

Una forma de hacerlo es llamar a SetTimer y luego manejar el evento WM_TIMER en su WndProc.Por ejemplo, esto podría configurar un temporizador que es llamada cada 45 segundos y muestra un cuadro de mensaje cuando se llama:

 
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) 
{ 
    switch(message) 
    { 
     case WM_CREATE: 
      SetTimer(hwnd, 1, 45000, NULL); 
      break; 

     case WM_TIMER: 
      MessageBox(hwnd, L"Timer", L"Timer fired!", MB_OK); 
      break; 
    } 
    return DefWindowProc(hwnd, message, wParam, lParam); 
} 

El primer parámetro a SetTimer es la ventana que desea recibir el mensaje WM_TIMER - es probable quiero que esta sea tu ventana para que puedas pasar el mensaje que las ventanas te pasaron.

El segundo parámetro es un número que puede usar para identificar de manera única el temporizador. Podrías tener más de un temporizador funcionando a la vez y necesitarías una forma de saber cuál disparó.

El tercer parámetro es cuánto tiempo quiere que el temporizador espere antes de que se dispare. Es en milisegundos, por lo que debe multiplicar por mil si desea segundos.

El cuarto parámetro es NULL si desea controlar temporizadores mirando WM_TIMER. De lo contrario, puede pasar un puntero a una función de devolución de llamada que se llamará en su lugar.

Recuerde, el temporizador seguirá disparando cada X milisegundos hasta que lo mate. Puedes matarlo llamando a KillTimer y pasando el mismo número que pasaste al segundo parámetro cuando llamaste a SetTimer.

Además, cuando Windows le envía el mensaje WM_TIMER, wParam contendrá el identificador del temporizador que pasó en el segundo parámetro cuando llamó a SetTimer.

+0

No necesita una ventana, solo necesita un bucle de mensaje –

0

Probablemente un poco fuera de objetivo, y es C++ no directamente C pero aquí está mi implementación de una cola de temporizador para Windows completa con pruebas y un comentario sobre TDD. Tenga en cuenta que la primera parte de la serie explica por qué decidí hacer mi propia versión en lugar de utilizar las alternativas.

http://www.lenholgate.com/blog/2004/05/practical-testing.html

1

De Timers and default actions:

/* ** TIMEGETC.C - waits for a given number of seconds for the user to press ** a key.  Returns the key pressed, or EOF if time expires ** ** by Bob Jarvis */ 

#include <stdio.h> 
#include <time.h> 
#include <conio.h> 

int timed_getch(int n_seconds) 
{ 
    time_t start, now; 

    start = time(NULL); now = start; 

    while(difftime(now, start) < (double)n_seconds && !kbhit()) { now = time(NULL); } 

    if(kbhit()) 
     return getch(); 
    else 
     return EOF; 
} 

void main(void) 
{ 
    int c; 

    printf("Starting a 5 second delay...\n"); 

    c = timed_getch(5); 

    if(c == EOF) 
     printf("Timer expired\n"); 
    else 
     printf("Key was pressed, c = '%c'\n", c); 
} 

Pero me gustaría considerar el uso de la ventana :: SetTimer(), como se mencionó anteriormente ...

Cuestiones relacionadas