GARANTIR DESCONTO

Fórum Timer em Microsegundos? #240255

29/06/2004

0

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

Responder

Posts

29/06/2004

Tatuweb

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:


Responder

Gostei + 0

29/06/2004

Nmk

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:



Responder

Gostei + 0

29/06/2004

Tatuweb

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:


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar