Timer em Microsegundos?
Ai pessoal me ajudem!!!!!!!!
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.
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
Curtidas 0
Respostas
Tatuweb
29/06/2004
Colega,
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:
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
Nmk
29/06/2004
Valeu colega Mas eu tenho certeza que preciso de de uma resolução de tempo bem alta se possivel nanosegundos (para um sistema de aquisição de dados muito rapido) se possivel me dê algumas dicas sobre as APIs, agradeço desde já valeu!!!!!!!!!!!!! :?:
Colega,
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
Tatuweb
29/06/2004
Colega,
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.
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.
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:
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