2009-09-17 18 views

risposta

7

Dai un'occhiata alla funzione SetTimer.

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

... Se si tratta di un'applicazione Win32 C con finestra. – Kieveli

+4

Sì, deve avere un loop di messaggi. Non ha bisogno di finestre, però. – avakar

+0

@avakar Quindi se si verifica qualche evento, devo resettare il timer. Come posso raggiungere questo obiettivo? – Sorcrer

0

I timer non fanno parte del linguaggio C.

Si dovrebbe cercare la documentazione per qualsiasi ambiente di programmazione che si sta utilizzando per capire come fare i timer. Dato che non hai indicato quale ambiente, non è possibile rispondere alla tua domanda.

+1

La piattaforma è Windows. – Vidya

0

Se siete disposti ad affrontare Win32 Thread Pools, è possibile utilizzare pool di thread timer.

Un pool di thread è un insieme di thread di lavoro che esegue in modo efficiente callback asincroni per conto dell'applicazione. Il pool di thread viene principalmente utilizzato per ridurre il numero di thread di applicazione e fornire la gestione dei thread di lavoro. Le applicazioni possono accodare gli oggetti di lavoro, associare il lavoro con le maniglie attendibili, accodare automaticamente in base a un timer e associare con I/O.

Una parte di questa API, vedi

CreateTimerQueueTimer Function

Crea un timer-coda. Questo timer scade al momento opportuno, quindi dopo ogni periodo specificato. Alla scadenza del timer, viene richiamata la funzione di richiamata.

0

Se non è necessario eseguire altre operazioni nell'applicazione, è possibile utilizzare la funzione sleep(). Interromperà l'esecuzione da continuare, quindi riprenderà il codice in esecuzione dopo che la durata specificata è scaduta (ish).

In Windows, si utilizzava una funzione timer multimediale se si desidera dormire per meno di un secondo di intervalli. Alcuni altri metodi dipendono dalla piattaforma.

Ho anche sentito parlare di persone che usano "select()" come metodo di sospensione per milli/micro secondi.

Se hai bisogno di altre cose, stai cercando di utilizzare il sonno/selezionare all'interno di un secondo thread.

Ecco uno Google Library for doing high resolution timing pure. Potrebbe aiutare.

+0

+1 perché mi è piaciuto il riferimento di Google. –

0

Un modo per farlo è chiamare SetTimer e quindi gestire l'evento WM_TIMER nel WndProc.Per esempio, questo potrebbe impostare un timer che viene chiamata ogni 45 secondi e visualizza una finestra di messaggio quando si chiama:

 
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); 
} 

Il primo parametro da SetTimer è la finestra che si desidera ricevere il messaggio WM_TIMER - probabilmente vuoi che questa sia la tua finestra in modo che tu possa semplicemente passare nella finestra che ti ha passato.

Il secondo parametro è un numero che è possibile utilizzare per identificare univocamente il timer. Potresti avere più di un timer alla volta e avresti bisogno di un modo per dire quale sparare.

Il terzo parametro indica per quanto tempo il timer deve attendere prima che si attivi. È in millisecondi, quindi devi moltiplicare per mille se vuoi secondi.

Il quarto parametro è NULL se si desidera gestire i timer guardando a WM_TIMER. Altrimenti, puoi passare un puntatore a una funzione di callback che verrà chiamata al suo posto.

Ricorda che il timer continuerà a sparare ogni X millisecondi finché non lo uccidi. Puoi ucciderlo chiamando KillTimer e passando lo stesso numero passato al secondo parametro quando hai chiamato SetTimer.

Inoltre, quando Windows invia il messaggio WM_TIMER, wParam conterrà l'identificatore del timer passato nel secondo parametro quando è stato chiamato SetTimer.

+0

Non hai bisogno di una finestra, hai solo bisogno di un ciclo di messaggi –

0

Probabilmente un bit fuori target, ed è C++ non dritto C ma ecco la mia implementazione di una coda timer per Windows completa di test e un commento su TDD. Si noti che la prima parte della serie spiega perché ho deciso di lanciare da solo piuttosto che usare le alternative.

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

1

Da 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); 
} 

Ma vorrei considerare l'utilizzo :: SetTimer di Window(), come detto sopra ...