Condividi tramite


Oggetti Timer attendebili

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

Oggetto Descrizione
timer di reimpostazione manuale Timer il cui stato rimane segnalato fino a quando SetWaitableTimer viene chiamato per stabilire un nuovo tempo di scadenza.
timer di sincronizzazione Timer il cui stato rimane segnalato fino a quando un thread completa un'operazione di attesa sull'oggetto timer.
timer periodico Timer riattivato ogni volta che il periodo specificato scade, fino a quando il timer non viene reimpostato o annullato. Un timer periodico è un timer di reimpostazione manuale periodico o un timer di sincronizzazione periodica.

 

Nota

Quando viene segnalato un timer, il processore deve essere eseguito per elaborare le istruzioni associate. I timer periodici ad alta frequenza mantengono continuamente occupato il processore, che impedisce al sistema di rimanere in uno stato di alimentazione inferiore per qualsiasi quantità di tempo significativa. Ciò può avere un impatto negativo sulla durata della batteria del computer portatile e sugli scenari che dipendono dalla gestione effettiva della potenza, ad esempio data center di grandi dimensioni. Per una maggiore efficienza energetica, prendere in considerazione l'uso di notifiche basate su eventi anziché notifiche basate sul tempo nell'applicazione. Se è necessario un timer, usare un timer segnalato una volta anziché un timer periodico o impostare l'intervallo su un valore maggiore di un secondo.

 

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 specificando il nome in una chiamata alla funzione OpenWaitableTimer . Qualsiasi thread con un handle a un oggetto timer può usare una delle funzioni di attesa per attendere che lo stato timer venga impostato su segnalato.

  • Il thread chiama la funzione SetWaitableTimer per attivare il timer. Si noti l'uso dei parametri seguenti per SetWaitableTimer:
  • Usare il parametro lpDueTime per specificare l'ora in cui il timer deve essere impostato sullo stato segnalato. Quando un timer di reimpostazione manuale viene impostato sullo stato segnalato, rimane in questo stato finché SetWaitableTimer stabilisce una nuova scadenza. Quando un timer di sincronizzazione è impostato sullo stato segnalato, rimane in questo stato fino a quando un thread completa un'operazione di attesa sull'oggetto timer.
  • Usare il parametro lPeriod della funzione SetWaitableTimer per specificare il periodo timer. Se il periodo non è zero, il timer è un timer periodico; viene riattivato ogni volta che il periodo scade, fino a quando il timer non viene reimpostato o annullato. Se il periodo è zero, il timer non è un timer periodico; viene segnalato una volta e quindi disattivato.

Un thread può usare la funzione CancelWaitableTimer per impostare il timer sullo stato inattivo. Per reimpostare il timer, chiamare SetWaitableTimer. Al termine dell'oggetto timer, chiamare CloseHandle per chiudere l'handle all'oggetto timer.

Il comportamento di un timer attendebile può essere riepilogato come segue:

  • Quando viene impostato un timer, viene annullato se è già attivo, lo stato del timer non è assegnato e il timer viene inserito nella coda del timer del kernel.
  • Quando scade un timer, il timer viene impostato sullo stato segnalato. Se il timer ha una routine di completamento, viene accodato al thread che imposta il timer. La routine di completamento rimane nella coda di chiamata di routine asincrona (APC) del thread fino a quando il thread non entra in uno stato di attesa avvisabile. In quel momento, il servizio APC viene inviato e viene chiamata la routine di completamento. Se il timer è periodico, viene inserito nella coda del timer del kernel.
  • Quando un timer viene annullato, viene rimosso dalla coda timer del kernel se è in sospeso. Se il timer era scaduto e c'è ancora un APC accodato al thread che imposta il timer, il APC viene rimosso dalla coda APC del thread. Lo stato segnalato del timer non è interessato.

Chiamate di routine asincrone

Uso di oggetti Timer waitable