Partilhar via


Objetos de temporizador de espera

Um objeto de temporizador de espera é um objeto de sincronização cujo estado é definido como sinalizado quando o tempo de conclusão especificado chega. Há dois tipos de temporizadores que podem ser criados: redefinição manual e sincronização. Um temporizador de qualquer tipo também pode ser um temporizador periódico.

Objeto Descrição
temporizador de redefinição manual Um temporizador cujo estado permanece sinalizado até que SetWaitableTimer seja chamado para estabelecer um novo tempo de conclusão.
temporizador de sincronização Um temporizador cujo estado permanece sinalizado até que um thread conclua uma operação de espera no objeto de temporizador.
temporizador periódico Um temporizador que é reativado sempre que o período especificado expira, até que o temporizador seja redefinido ou cancelado. Um temporizador periódico é um temporizador periódico de redefinição manual ou um temporizador de sincronização periódica.

 

Observação

Quando um temporizador é sinalizado, o processador deve ser executado para processar as instruções associadas. Os temporizadores periódicos de alta frequência mantêm o processador continuamente ocupado, o que impede que o sistema permaneça em um estado de energia mais baixo por qualquer período significativo de tempo. Isso pode ter um impacto negativo na duração da bateria do computador portátil e em cenários que dependem do gerenciamento efetivo de energia, como datacenters grandes. Para maior eficiência energética, considere usar notificações baseadas em evento em vez de notificações baseadas em tempo em seu aplicativo. Se um temporizador for necessário, use um temporizador que seja sinalizado uma vez em vez de um temporizador periódico ou defina o intervalo como um valor maior que um segundo.

 

Um thread usa a função CreateWaitableTimer ou CreateWaitableTimerEx para criar um objeto de temporizador. O thread de criação especifica se o temporizador é um temporizador de redefinição manual ou um temporizador de sincronização. O thread de criação pode especificar um nome para o objeto de temporizador. Threads em outros processos podem abrir um identificador para um temporizador existente especificando seu nome em uma chamada para a função OpenWaitableTimer . Qualquer thread com um identificador para um objeto de temporizador pode usar uma das funções de espera para aguardar o estado do temporizador ser definido como sinalizado.

  • O thread chama a função SetWaitableTimer para ativar o temporizador. Observe o uso dos seguintes parâmetros para SetWaitableTimer:
  • Use o parâmetro lpDueTime para especificar a hora em que o temporizador deve ser definido como o estado sinalizado. Quando um temporizador de redefinição manual é definido como o estado sinalizado, ele permanece nesse estado até que SetWaitableTimer estabeleça um novo tempo de conclusão. Quando um temporizador de sincronização é definido como o estado sinalizado, ele permanece nesse estado até que um thread conclua uma operação de espera no objeto de temporizador.
  • Use o parâmetro lPeriod da função SetWaitableTimer para especificar o período do temporizador. Se o período não for zero, o temporizador será um temporizador periódico; ele é reativado sempre que o período expira, até que o temporizador seja redefinido ou cancelado. Se o período for zero, o temporizador não será um temporizador periódico; ele é sinalizado uma vez e desativado.

Um thread pode usar a função CancelWaitableTimer para definir o temporizador para o estado inativo. Para redefinir o temporizador, chame SetWaitableTimer. Quando terminar de usar o objeto de temporizador, chame CloseHandle para fechar o identificador do objeto de temporizador.

O comportamento de um temporizador de espera pode ser resumido da seguinte maneira:

  • Quando um temporizador é definido, ele é cancelado se já estava ativo, o estado do temporizador não está atribuído e o temporizador é colocado na fila do temporizador do kernel.
  • Quando um temporizador expira, o temporizador é definido como o estado sinalizado. Se o temporizador tiver uma rotina de conclusão, ele será enfileirado no thread que define o temporizador. A rotina de conclusão permanece na fila de APC ( chamada de procedimento assíncrono ) do thread até que o thread entre em um estado de espera alertável. Nesse momento, a APC é expedida e a rotina de conclusão é chamada. Se o temporizador for periódico, ele será colocado novamente na fila do temporizador do kernel.
  • Quando um temporizador é cancelado, ele é removido da fila do temporizador do kernel se ele estava pendente. Se o temporizador tiver expirado e ainda houver um APC enfileirado no thread que definiu o temporizador, o APC será removido da fila de APC do thread. O estado sinalizado do temporizador não é afetado.

Chamadas de procedimento assíncrono

Usando objetos de temporizador de espera