Condividi tramite


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.

Oggetto Descrizione
timer di reimpostazione manuale Timer il cui stato rimane segnalato fino a quando non viene chiamato SetWaitableTimer per stabilire un nuovo tempo di scadenza.
timer di sincronizzazione Timer il cui stato rimane segnalato fino a quando un thread non 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 periodico.

 

Nota

Quando viene segnalato un timer, il processore deve essere eseguito per elaborare le istruzioni associate. I timer periodici ad alta frequenza mantengono costantemente occupato il processore, impedendo al sistema di rimanere in uno stato di alimentazione inferiore per qualsiasi quantità significativa di tempo. Ciò può avere un impatto negativo sulla durata della batteria del computer portatile e sugli scenari che dipendono da una gestione efficace dell'alimentazione, ad esempio data center di grandi dimensioni. Per una maggiore efficienza energetica, è consigliabile usare 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 oppure 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 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 attendere che lo stato del timer venga impostato su segnalato.

  • Il thread chiama la funzionesetWaitableTimerper 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 è impostato sullo stato segnalato, rimane in questo stato fino a SetWaitableTimer stabilisce un nuovo tempo di scadenza. Quando un timer di sincronizzazione è impostato sullo stato segnalato, rimane in questo stato finché un thread non completa un'operazione di attesa sull'oggetto timer.
  • Utilizzare il parametro lPeriod della funzioneSetWaitableTimerper specificare il periodo timer. Se il punto non è zero, il timer è un timer periodico; viene riattivata ogni volta che scade il periodo, fino a quando il timer non viene reimpostato o annullato. Se il punto è zero, il timer non è un timer periodico; viene segnalato una volta e poi disattivato.

Un thread può usare la funzioneCancelWaitableTimerper 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 waitable può essere riepilogato nel modo seguente:

  • Quando viene impostato un timer, viene annullato se è già attivo, lo stato del timer non è firmato e il timer viene inserito nella coda del timer del kernel.
  • Quando un timer scade, 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 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 del timer del kernel se era in sospeso. Se il timer era scaduto e c'è ancora un APC in coda al thread che imposta il timer, l'APC viene rimosso dalla coda APC del thread. Lo stato segnalato del timer non è interessato.

chiamate di procedure asincrone

uso di oggetti timer waitable