Fórum Timer em Microsegundos? #240255
29/06/2004
0
Eu sou iniciante em programação em Delphi
eu estava precisando de um Timer com intervalo
de tempo de micro segundos e não de mile segundos
como o Delphi é configurado.
Alguem sabe como eu faço essa alteração? se é que
é possivel.
Nmk
Curtir tópico
+ 0Posts
29/06/2004
Tatuweb
Não é possível configurar o componente Timer para trabalhar com micro-segundo. O timer processa as mensagens WM_TIMER e usa a API SetTimer, cujo os parâmetros são dados em mili-segundos. Acredito que 1 mili-segundo é tempo mais do que suficiente para se configurar um timer.
Existem duas APIs, QueryPerformanceCounter e QueryPerformanceFrequency, que permitem a vc trabalhar até na ordem dos nano-segundos, dependendo do processador. Essas APIs são normalmente usadas para medir desempenho de rotinas ou pesquisa em SGBDs. Usar essas APIs é bem simples mas antes veja se vc realmente precisa ter uma precisão de tempo para um Timer do porte dos micro-segundos. Se tiver mas alguma dúvida para implementar alguma função é só postar.
:wink:
Gostei + 0
29/06/2004
Nmk
Gostei + 0
29/06/2004
Tatuweb
Essas APIs eu vi a algum tempo mas nunca cheguei a usá-las. Eu dei uma olhada agora na dica e vi que elas estavam sendo empregadas para medir o tempo de resposta de uma consulta a um SGBD, isto é, elas estavam sendo usadas para medir qual comando era mais rápido. Agora quanto manter essas funções como um ´Timer´ eu me enganei.
De qualquer forma vou deixar uma dica de como usar essa API. A função abaixo executa uma função durante X micro-segundos.
procedure Delay64 (MicroSec: DWord); var F1, F2: Int64; begin QueryPerformanceCounter (F1); repeat // Application.ProcessMessages; // Instrução a ser executada QueryPerformanceCounter (F2); until ((F2 - F1) >= MicroSec); end;
Para executar a mesma instrução durante um segundo, por exemplo, vc usaria Timer64 (1000000). A função abaixo retorna quantos micro-segundos foram necessários para executar uma instrução.
function Timer64: Int64; var F1, F2: Int64; begin QueryPerformanceCounter (F1); // Instrução a ser executada QueryPerformanceCounter (F2); Result := F2 - F1; end;
Não sei se ajudou muito mas creio que o caminho seja esse. Como as duas funções não usa a API QueryPerformanceFrequency vai ter um pequeno erro de precisão. :wink:
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)