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 vencimento especificado chega. Existem dois tipos de temporizadores de espera que podem ser criados: reposição manual e sincronização. Um temporizador de qualquer tipo também pode ser um temporizador periódico.
Objeto | Descrição |
---|---|
temporizador de reposição manual | Um temporizador cujo estado permanece sinalizado até SetWaitableTimer é chamado para estabelecer um novo tempo de vencimento. |
temporizador de sincronização | Um temporizador cujo estado permanece sinalizado até que um thread conclua uma operação de espera no objeto do 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 de reposição manual periódica 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 de menor por qualquer quantidade significativa de tempo. Isso pode ter um impacto negativo na vida útil da bateria do computador portátil e em cenários que dependem de um gerenciamento de energia eficaz, como grandes datacenters. Para maior eficiência energética, considere o uso de notificações baseadas em eventos em vez de notificações baseadas em tempo em seu aplicativo. Se for necessário um temporizador, utilize um temporizador sinalizado uma vez em vez de um temporizador periódico ou defina o intervalo para um valor superior a um segundo.
Um thread usa o CreateWaitableTimer ou função de 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 o função OpenWaitableTimer. Qualquer thread com um identificador para um objeto de temporizador pode usar uma das funções de espera aguardar que o estado do temporizador seja definido como sinalizado.
- O thread chama o 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 para o estado sinalizado. Quando um temporizador de redefinição manual é definido para o estado sinalizado, ele permanece nesse estado até que SetWaitableTimer estabeleça um novo tempo de vencimento. Quando um temporizador de sincronização é definido para o estado sinalizado, ele permanece nesse estado até que um thread conclua uma operação de espera no objeto do temporizador.
- Use o parâmetro lPeriod da funçãoSetWaitableTimer para especificar o período do temporizador. Se o período não for zero, o temporizador é um temporizador periódico; Ele é reativado cada vez que o período expira, até que o temporizador seja redefinido ou cancelado. Se o período for zero, o temporizador não é um temporizador periódico; é sinalizado uma vez e depois desativado.
Um thread pode usar a funçãoCancelWaitableTimer 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 para o objeto de temporizador.
O comportamento de um temporizador de espera pode ser resumido da seguinte forma:
- Quando um temporizador é definido, ele é cancelado se já estava ativo, o estado do temporizador não é sinalizado e o temporizador é colocado na fila do temporizador do kernel.
- Quando um temporizador expira, o temporizador é definido para o estado sinalizado. Se o temporizador tiver uma rotina de conclusão, ele será enfileirado para o thread que definiu o temporizador. A rotina de conclusão permanece na fila de de chamada de procedimento assíncrono (APC) do thread até que o thread entre em um estado de espera alertável. Nesse momento, o APC é despachado e a rotina de conclusão é chamada. Se o temporizador for periódico, ele será colocado de volta na fila do temporizador do kernel.
- Quando um temporizador é cancelado, ele é removido da fila do temporizador do kernel se estiver pendente. Se o temporizador tiver expirado e ainda houver um APC enfileirado para o thread que definiu o temporizador, o APC será removido da fila APC do thread. O estado sinalizado do temporizador não é afetado.
Tópicos relacionados