Sobre temporizadores

Este tópico descreve como criar, identificar, definir e excluir temporizadores. Um aplicativo usa um temporizador para agendar um evento para uma janela depois de ser decorrido um tempo especificado. Sempre que o intervalo de tempo especificado (ou o valor de tempo limite) de um temporizador termina, o sistema notifica a janela associada ao temporizador. Como a precisão de um temporizador depende da velocidade do clock do sistema e da frequência com que o aplicativo recupera mensagens da fila de mensagens, o valor do tempo limite é somente uma estimativa.

Este tópico inclui as seções a seguir.

Operações de temporizador

Os aplicativos criam temporizadores usando a função SetTimer. Um novo temporizador inicia o intervalo assim que ele é criado. Um aplicativo pode alterar o valor de tempo limite de um tempo limite usando SetTimer e pode destruir um temporizador usando a função KillTimer. Para usar recursos do sistema com eficiência, os aplicativos devem destruir temporizadores que não são mais necessários.

Cada temporizador tem um identificador exclusivo. Ao criar um temporizador, um aplicativo pode especificar um identificador ou fazer com que o sistema crie um valor exclusivo. O primeiro parâmetro de uma mensagem WM_TIMER contém o identificador do temporizador que postou a mensagem.

Se você especificar um identificador de janela na chamada para SetTimer, o aplicativo associará o temporizador a essa janela. Sempre que o valor de tempo limite do temporizador é atingido, o sistema posta uma mensagem WM_TIMER na janela associada ao temporizador. Se nenhum identificador de janela for especificado na chamada para SetTimer, o aplicativo que criou o temporizador deverá monitorar sua fila de mensagens para mensagens WM_TIMER e expedi-las para a janela apropriada.

Observação

Se você especificar a função opcional de retorno de chamada TIMERPROC, a função será chamada durante o Loop de mensagens e WM_TIMER não será expedido para o retorno de chamada WNDPROC.

Se você precisar ser notificado quando o tempo definido em um temporizador terminar, use um temporizador de espera. Para obter mais informações, confira Objetos de temporizador de espera.

Temporizador de alta resolução

"Contador" é um termo geral usado na programação para se referir a uma variável de incremento. Alguns sistemas incluem um contador de desempenho de alta resolução que fornece tempos decorridos de alta resolução.

Se houver um contador de desempenho de alta resolução no sistema, você poderá usar a função QueryPerformanceFrequency para expressar a frequência, em contagens por segundo. O valor da contagem depende do processador. Em alguns processadores, por exemplo, a contagem pode ser a taxa de ciclo do relógio do processador.

A função QueryPerformanceCounter recupera o valor atual do contador de desempenho de alta resolução. Ao chamar essa função no início e no final de uma seção de código, essencialmente, um aplicativo usa o contador como um temporizador de alta resolução. Por exemplo, suponha que QueryPerformanceFrequency indique que a frequência do contador de desempenho de alta resolução é de 50.000 contagens por segundo. Se o aplicativo chamar QueryPerformanceCounter imediatamente antes e imediatamente após a seção do código a ser cronometrada, os valores do contador poderão ser 1500 contagens e 3500 contagens, respectivamente. Esses valores indicam que 0,04 segundos (2.000 contagens) foram decorridos enquanto o código estava sendo executado.

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 se encerra. 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.

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. Os 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 que o estado do temporizador seja definido como sinalizado.

Para obter mais informações sobre como usar objetos de temporizador de espera para sincronização de thread, confira Objetos de temporizador de espera.