Timer synchronizacja

dział ogólny

Timer synchronizacja

Nowy postprzez Koziol » czwartek, 22 kwietnia 2010, 19:59

W jaki sposób z synchronizować Timer z zegarem systemowym z dokładnością do 100ms chodzi mi o to żeby zdarzenie wykonywało się o konkretnych godzinach np. w taki sposób:
00:00:01'0000
00:00:01'0100
00:00:01'0200
00:00:01'0300
00:00:01'0400
Avatar użytkownika
Koziol
Intelektryk
Intelektryk
 
Posty: 144
Dołączył(a): niedziela, 13 lipca 2008, 17:36
PodziÄ™kowaÅ‚ : 8
OtrzymaÅ‚ podziÄ™kowaÅ„: 2
System operacyjny: Windows XP Pro SP2
Kompilator: C++ Builder
    Windows XPFirefox

Re: Timer synchronizacja

Nowy postprzez Cyfrowy Baron » piÄ…tek, 23 kwietnia 2010, 08:14

Dokładność to ustawiasz sobie we właściwości Interval obiektu Timer. Zegar można zsynchronizować z zegarem BIOS'u, ale nie oznacza to, że będzie on tykał z dokładnością do 100 ms lecz, że będzie dokładnie odmierzał czas. Podczas pracy w systemie będzie się zdarzać, że zegar będzie omijał interwały, na co mają wpływ programy działające w systemie, dlatego należy wykorzystać zdarzenie OnTimer do sprawdzania rzeczywistego upływu czasu i aktualizacji zegara. W efekcie zdarzenie OnTimer nie będzie już rejestrować czasu, lecz posłuży do aktualizacji wyświetlanej informacji. W tym celu należy posłużyć się funkcją timeGetTime podającą ile czasu upłynęło od uruchomienia systemu Windows. Funkcja występuje w bibliotece mmsystem.hpp.

Pełen listing przykładowego stopera:

Plik nagłówkowy Unit1.h
Kod: Zaznacz cały
//---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <mmsystem.hpp>
#include <ExtCtrls.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:    // IDE-managed Components
    TTimer *Timer1;
    TLabel *Label1;
    TButton *StartButton;
    TButton *ResetButton;
    void __fastcall Timer1Timer(TObject *Sender);
    void __fastcall StartButtonClick(TObject *Sender);
    void __fastcall ResetButtonClick(TObject *Sender);
private:
    // User declarations

        long startTime, elapsedTime;

public:
        // User declarations
    __fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif  


Plik źródłowy Unit1.cpp
Kod: Zaznacz cały
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
 startTime   = 0;
 elapsedTime = 0;

 Label1->Caption = "0.000";
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
 elapsedTime = timeGetTime() - startTime;
 Label1->Caption = FloatToStrF( ((float)elapsedTime) / 1000.0, ffNumber, 7, 3);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::StartButtonClick(TObject *Sender)
{
 if(Timer1->Enabled)
 {
   Timer1->Enabled = false;

   StartButton->Caption = "Start";
 }
 else
 
{
  startTime   = timeGetTime();
  elapsedTime = 0;
  Timer1->Enabled = true;

  StartButton->Caption = "Stop";
 }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ResetButtonClick(TObject *Sender)
{
 startTime   = timeGetTime();
 elapsedTime = 0;

 Label1->Caption = "0.000";
}
//---------------------------------------------------------------------------
 


Zegar odmierza czas z dokładnością do 3 miejsc po przecinku, więc teoretycznie przy interwale czasu o wartości 100 ms powinien wyświetlać czas w taki sposób: 0.100 0.200 0.300 0.400 itd. Tak się jednak nie dzieje, zauważysz, że zegar odmierza nie tylko wartości dziesiętne, ale również setne i tysięczne, więc czas będzie pokazywany np. tak: 0.100 0.210 0.315 0.405 itd. Dzieje się tak dlatego, że zegar omija niektóre tyknięcia, ale czas jest odmierzany z dokładnością do 100 ms, informacja o czasie również jest wyświetlana prawidłowo, tylko tyknięcie zegara nie zawsze wypada dokładnie co 100 ms, dlatego wyświetlany czas zawiera milisekundy o wartościach mniejszych niż 100 ms..
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przeglÄ…da forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 7 gości

cron