Relógio interno

02/06/2008

3

Olá pessoal, preciso de uma ajuda para montar um relógio no sistema que seja sincronizado em sua criação com a data e hora vinda de um servidor.Ou seja eu dou uma data e uma inicial a ele, e a partir de então ele vai incrementando o tempo.


Responder

Posts

02/06/2008

Javapaulomg

Olá pessoal, preciso de uma ajuda para montar um relógio no sistema que seja sincronizado em sua criação com a data e hora vinda de um servidor.Ou seja eu dou uma data e uma inicial a ele, e a partir de então ele vai incrementando o tempo.


Não sei se seria um boa pratica, mais pode obter a data e hora do servidor atraves de uma consulta SQL, e apartir dai ir incrementando uma variável com está data e hora com um componente TTimer, espero ter ajudado.


Responder

07/08/2008

Joaohenriquemf

mais no caso como seria alimentada essa variável?Por um componente chamado timer?alguma coisa assim?


Responder
Fasso assim em minhas aplicações

procedure tConsultas.SincronizaHora;
var
  Data:TSystemTime;
  ano,dia,mes,hora,segundo,minuto,ml:word;
  Dt:tDateTime;
begin
  try
    Conexao := tConexao.create(nil,´sCom´);
    GetLocalTime(Data);
    with Conexao.Query do
    begin
      Close;
      SQL.Clear;
      SQL.Add(´SELECT CURRENT_TIMESTAMP FROM RDB$DATABASE´);
      Open;

      Dt := Fields[0].AsDateTime;
      Close;

    end;

    DecodeDate(dt,ano,mes,dia);
    DecodeTime(dt,hora,minuto,segundo,ml);

    with Data do
    begin
      wYear := ano;
      wMonth:= mes;
      wDay := dia;

      wHour:= hora;
      wMinute := minuto;
      wSecond := segundo;

    end;

    SetLocalTime(Data);


  finally
    Conexao.Destroy;

  end;

end;


PS: Conexao é a classe que criei pra conexão com banco de dados.
PS2 : Nescessário declarar unit DateUtils


Responder
Não tinha prestado atenção direito no que você queria.
Do modo que coloquei acima você irá alterar a data e hora do computador cliente com a data e hora do servidor, mais a idéia é a mesma que o colega falou acima, pegar a data e hora do servidor através de uma consulta SQL por exemplo, alimentar uma váriavel e ir incrementando a mesma com um tTimer por exemplo

mais no caso como seria alimentada essa variável?Por um componente chamado timer?alguma coisa assim?


Você pode declarar uma váriavel do tipo datetime, dai no evento onTimer de um tTimer você pode ir acrescentando um segundo a cada disparo:

Ex:

Para pegar a data e hora num servidor Firebird por exemplo:
   with Query do
   begin 
      Close; 
      SQL.Clear; 
      SQL.Add(´SELECT CURRENT_TIMESTAMP FROM RDB$DATABASE´); 
      Open; 

      VarDataHora := Fields[0].AsDateTime; 
      Close; 

    end;


O Evento do Timer:
  
            VarDataHora := IncSecond(VarDataHora,1);
            Label1.Caption := DateTimeToStr(VarDataHora);


Ps: Para utilizar a função IncSecond é nescessário declarar a unit DateUtils na uses do teu form.


Responder
Meu caro amigo,

não podemos desperdiçar memória... e sabemos que se consultarmos
e incrementar pode sair de sincronia se alguem alterar a data no servidor
do banco, se você procura mesmo integridade faça o seguinte:

- Ative no cliente o serviço de ´Horário do Windows´, isso fará com que
sempre que o windows carregar sincronize a hora do computador cliente
com o servidor DNS.

- Esqueça de rotinas de incremento, a cada vez que for gravar algo que
necessita de integridade de horário é só fazer o select da hora que nosso
amigo postou acima e verificar com a hora do computador colocando uma
margenzinha de tolerância de uns 5 minutos (ou quanto achar melhor) entre o retorno do select e a hora da máquina local. Caso a hora local saia
da faixa informe ao usuário a hora local e hora do servidor para que o
mesmo corrija.

Existem maneiras e maneiras de trabalhar, nosso amigo acima não está
errado, mas prefiro trabalhar assim...

um abraço e espero ter ajudado.


Responder
×
+1 DevUP
Acesso diário, +1 DevUP
Parabéns, você está investindo na sua carreira