Share via


Informazioni sui timer

In questo argomento viene descritto come creare, identificare, impostare ed eliminare timer. Un'applicazione usa un timer per pianificare un evento per una finestra dopo che è trascorso un tempo specificato. Ogni volta che scade l'intervallo specificato (o il valore di timeout) per un timer, il sistema invia una notifica alla finestra associata al timer. Poiché l'accuratezza di un timer dipende dalla frequenza di clock di sistema e dalla frequenza con cui l'applicazione recupera i messaggi dalla coda dei messaggi, il valore di timeout è solo approssimativo.

Questo argomento include le sezioni seguenti.

Operazioni timer

Le applicazioni creano timer usando la funzione SetTimer. Un nuovo timer inizia a intervallare l'intervallo non appena viene creato. Un'applicazione può modificare il valore di timeout di un timer usando SetTimer e può distruggere un timer usando la funzione KillTimer. Per usare le risorse di sistema in modo efficiente, le applicazioni devono eliminare i timer che non sono più necessari.

Ogni timer ha un identificatore univoco. Quando si crea un timer, un'applicazione può specificare un identificatore o creare un valore univoco nel sistema. Il primo parametro di un messaggio di WM_TIMER contiene l'identificatore del timer che ha inviato il messaggio.

Se si specifica un handle di finestra nella chiamata a SetTimer, l'applicazione associa il timer a tale finestra. Ogni volta che scade il valore di timeout per il timer, il sistema invia un messaggio WM_TIMER alla finestra associata al timer. Se non viene specificato alcun handle di finestra nella chiamata a SetTimer, l'applicazione che ha creato il timer deve monitorare la coda dei messaggi per WM_TIMER messaggi e inviarli alla finestra appropriata.

Nota

Se si specifica la funzione di callback TIMERPROC facoltativa, la funzione viene chiamata durante il ciclo di messaggi e WM_TIMER non viene inviata al callback WNDPROC.

Se è necessario ricevere una notifica quando un timer è trascorso, usare un timer waitable. Per altre informazioni, vedere Oggetti timer waitable.

Timer ad alta risoluzione

Un contatore è un termine generale usato nella programmazione per fare riferimento a una variabile a incremento. Alcuni sistemi includono un contatore delle prestazioni ad alta risoluzione che fornisce tempi trascorsi ad alta risoluzione.

Se nel sistema esiste un contatore delle prestazioni ad alta risoluzione, è possibile usare la funzione QueryPerformanceFrequency per esprimere la frequenza, in conteggi al secondo. Il valore del conteggio dipende dal processore. In alcuni processori, ad esempio, il conteggio potrebbe essere la frequenza del ciclo dell'orologio del processore.

La funzione QueryPerformanceCounter recupera il valore corrente del contatore delle prestazioni ad alta risoluzione. Chiamando questa funzione all'inizio e alla fine di una sezione di codice, un'applicazione usa essenzialmente il contatore come timer ad alta risoluzione. Si supponga, ad esempio, che QueryPerformanceFrequency indichi che la frequenza del contatore delle prestazioni ad alta risoluzione è di 50.000 conteggi al secondo. Se l'applicazione chiama QueryPerformanceCounter immediatamente prima e subito dopo la sezione di codice da assegnare, i valori dei contatori potrebbero essere 1500 conteggi e 3500 conteggi, rispettivamente. Questi valori indicano che sono trascorsi 04 secondi (2000 conteggi) durante l'esecuzione del codice.

Oggetti timer waitable

Un oggetto timer waitable è un oggetto di sincronizzazione il cui stato è impostato su segnalato quando arriva l'ora di scadenza specificata. È possibile creare due tipi di timer in attesa: reimpostazione manuale e sincronizzazione. Un timer di entrambi i tipi può anche essere un timer periodico.

Un thread usa la funzione CreateWaitableTimer o CreateWaitableTimerEx per creare un oggetto timer. Il thread di creazione specifica se il timer è un timer di reimpostazione manuale o un timer di sincronizzazione. Il thread di creazione può specificare un nome per l'oggetto timer. I thread in altri processi possono aprire un handle a un timer esistente specificandone il nome in una chiamata alla funzione OpenWaitableTimer. Qualsiasi thread con un handle per un oggetto timer può usare una delle funzioni di attesa per attendere che lo stato del timer venga impostato su segnalato.

Per altre informazioni sull'uso di oggetti timer waitable per la sincronizzazione dei thread, vedere Waitable Timer Objects.