Timer em Microsegundos?

Delphi

29/06/2004

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.


Nmk

Nmk

Curtidas 0

Respostas

Tatuweb

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:


GOSTEI 0
Nmk

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

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.

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
POSTAR