Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Software-Projekte der Mitglieder (https://www.delphipraxis.net/26-software-projekte-der-mitglieder/)
-   -   .: Atomuhr :. (https://www.delphipraxis.net/57385-atomuhr.html)

Chrissi91 20. Nov 2005 15:24


.: Atomuhr :.
 
Liste der Anhänge anzeigen (Anzahl: 2)
Hi :hi:,

da ich in einigen Programmen eine Atomuhr benötige, habe ich einfach mal sowas programmiert. Es ist eigentlich sehr simple. Ich frage die Atomzeit über das Internet ab und zeige sie an.
So richtig Sinn hat das Programm nicht :lol:, aber wenn jemand den Sourcecode haben will, posten ich ihn natürlich gerne. :mrgreen:

Chrissi91 :bouncing4:

Aktuellste Version: 1.1.0

PierreB 20. Nov 2005 15:27

Re: .: Atomuhr :.
 
Zitat:

[...] über das Internet ab und zeige sie an.
Was hältst du davon wenn du die Zeit nicht nur anzeigst, sondern gleich die Windows-Uhr richtig stellst ? :stupid:

Hab mir dein Programm nicht angesehen, aber ich denke nicht das es das ^^ bereits tut. ;)

MrKnogge 20. Nov 2005 15:28

Re: .: Atomuhr :.
 
Hi,

das tool funktioniert bei mir ohne Probleme, nützlich wäre vielleicht noch, wenn man sich den Server aussuchen könnte.

gruss

PS: Würde mir den Code gern mal ansehen.

Chrissi91 20. Nov 2005 15:33

Re: .: Atomuhr :.
 
Also das mit der Systemzeit umstellen, versuche ich, aber ich schaffe das nicht so richtig (s. hier)

Code muss ich erst mal richtig einrücken und so ... kommt nachher :lol:

ichbins 20. Nov 2005 15:37

Re: .: Atomuhr :.
 
du solltest den Timer schneller ticken lassen. ich hab das Gefühl dass die neue Zeit in ganz unterschiedlichen Abständen angezeigt wird.

Chrissi91 20. Nov 2005 15:53

Re: .: Atomuhr :.
 
Version 1.0.2 im ersten Beitrag. Änderungen habe ich dort auch aufgelistet.

ichbins 20. Nov 2005 15:57

Re: .: Atomuhr :.
 
:kotz:
  • Form lässt sich nicht mehr ordentlich verschieben
  • Ist es Absicht dass man die Captions von den Buttons nicht lesen kann?
http://www.michaelensslin.kilu.de/ss2.jpg

Luckie 20. Nov 2005 15:59

Re: .: Atomuhr :.
 
Sag mal, holst du dir jede Sekunde die Zeit vom Zeitserver? Du brauchst sie dir dochnur einmal holen, dann kannst du selber weiterzählen und die Verbindung zum Server wieder schließen.

Chrissi91 20. Nov 2005 16:01

Re: .: Atomuhr :.
 
???

Muss wohl daran liegen, dass ich kein XP habe, aber trotzdem XP Manifest reingetan habe ... Bei mir ist ales bestens.

Habe jetzt eine andere Verion hochgeladen ... s. erster Beitrag

Zitat:

Zitat von Luckie
Sag mal, holst du dir jede Sekunde die Zeit vom Zeitserver? Du brauchst sie dir dochnur einmal holen, dann kannst du selber weiterzählen und die Verbindung zum Server wieder schließen.

Nein, nicht jede Seknde, aber recht oft, da Timer sehr ungenau sind, aber das werde ich gleich mal machen ...

ichbins 20. Nov 2005 16:06

Re: .: Atomuhr :.
 
zeig mal einen Screenshot.

Ohne Timer geht das so:

Delphi-Quellcode:
var
  internetzeit,pczeit:tdatetime;


procedure tform1.timer1ontimer;
begin
  // INTERNETZEIT DOWNLOADEN; Intervall von Timer1 = 60000
  internetzeit:=downgeloadete zeit;
  pczeit:=now;
end;

procedure tform1.timer2ontimer;
var
  auszugebendezeit:tdatetime;
begin
  // ZEIT AUSGEBEN; Intervall von Timer2 = 10
  auszugebendezeit:=now+internetzeit-pczeit;
  label1.caption:=timetostr(auszugebendezeit);
end;
//edit: du musst die colors von der Buttoncaption auf clblack setzten. welche Komponente verwendest du denn für die Buttons?

arbu man 20. Nov 2005 16:15

Re: .: Atomuhr :.
 
Was noch schön ware die anzeige von 1/10 und 1/100 Sekunden. Dann würde das Prog auch mehr Sinn machen

Chrissi91 20. Nov 2005 16:58

Re: .: Atomuhr :.
 
Zitat:

Zitat von ichbins
//edit: du musst die colors von der Buttoncaption auf clblack setzten. welche Komponente verwendest du denn für die Buttons?

Speedbuttons mit der Eigenschaft Flat=true;

Zitat:

Zitat von arbu man
Was noch schön ware die anzeige von 1/10 und 1/100 Sekunden. Dann würde das Prog auch mehr Sinn machen

Meinst du jetzt Millisekunden und Zehntelsekunden, oder wie?

ichbins 20. Nov 2005 17:04

Re: .: Atomuhr :.
 
hundertstelsekunden. Für Millisekunden ist tdatetime zu ungenau.

Chrissi91 20. Nov 2005 18:06

Re: .: Atomuhr :.
 
Also ... Version 1.3 ist raus

Es läuft jetzt alles mit einem Timer ab, nur einmal wird die Uhrzeit aus dem Internet gezogen (beim Start). Das stündliche kommt auch noch. Die 100stel Sekunden kommen noch ;)

faux 20. Nov 2005 18:26

Re: .: Atomuhr :.
 
Hallo!

Das mit den Buttons funktioniert bei mir nicht so richtig. Hab Windows XP. Beim Hovern wird der Button weiß.

Grüße
Faux

Helmi 20. Nov 2005 18:29

Re: .: Atomuhr :.
 
wo ist die version 1.0.3?
ich kann im ersten Beitrag nur 1.0.0 finden.

Bei deinem Info-Fenster ist oben und links ein kleiner weisser Pixelrand zu sehen - den solltest du entfernen.

Chrissi91 20. Nov 2005 18:29

Re: .: Atomuhr :.
 
Liste der Anhänge anzeigen (Anzahl: 1)
Abend,

also ... für alle, bei denen das mit dem Button nicht funzt, hier im Win98 design ... wird hoffentlich gehen ;)

Chrissi91 20. Nov 2005 18:31

Re: .: Atomuhr :.
 
Zitat:

Zitat von Helmi
wo ist die version 1.0.3?
ich kann im ersten Beitrag nur 1.0.0 finden.

Bei deinem Info-Fenster ist oben und links ein kleiner weisser Pixelrand zu sehen - den solltest du entfernen.

Weiterlesen ;) Später ist Version 1.1.0 gekommen ;)

Weißen Pixelrand änder ich

Helmi 20. Nov 2005 18:34

Re: .: Atomuhr :.
 
Zitat:

Zitat von Chrissi91
Zitat:

Zitat von Helmi
wo ist die version 1.0.3?
ich kann im ersten Beitrag nur 1.0.0 finden.

Bei deinem Info-Fenster ist oben und links ein kleiner weisser Pixelrand zu sehen - den solltest du entfernen.

Weiterlesen ;) Später ist Version 1.1.0 gekommen ;)

Dann solltest du deine Versions-Angabe im Info-Fenster auch an die neue Version anpassen - da steht immer noch Version 1.0.0 drin

Ansonsten ein nettes Progrämmchen! - Mich würd der Code interessieren.

Chrissi91 20. Nov 2005 18:49

Re: .: Atomuhr :.
 
Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
var
sekunde, minute, stunde: integer;
uhr: string;
begin
stunde:=strtoint(copy(label2.caption,1,2));
minute:=strtoint(copy(label2.caption,4,2));
sekunde:=strtoint(copy(label2.caption,7,2));
if stunde= 24 then
begin
 stunde:=1;
end;
if minute=60 then
begin
 minute:=1;
 stunde:=stunde+1;
end;
if sekunde=60 then
begin
 sekunde:=1;
 minute:=minute+1;
end;
sekunde:=sekunde+1;
if length(inttostr(stunde))=1 then uhr:='0'+inttostr(stunde)+':' else uhr:=inttostr(stunde)+':';
if length(inttostr(minute))=1 then uhr:=uhr+'0'+inttostr(minute)+':' else uhr:=uhr+inttostr(minute)+':';
if length(inttostr(sekunde))=1 then uhr:=uhr+'0'+inttostr(sekunde) else uhr:=uhr+inttostr(sekunde);
label2.Caption:=uhr;
end;

procedure TForm1.IdIPWatch1StatusChanged(Sender: TObject);
begin
if IdIPWatch1.IsOnline then status:=true else status:=false;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 status:=true;
  try
  edit1.text:=IdHTTP1.Get('http://mlutime.uni-halle.de/cgi-bin/meinberg.cgi');
  label1.caption:=copy(edit1.Text,447,10);
  label2.caption:=copy(edit1.Text,458,8);
 except
  timer1.Enabled:=false;
  if status=false then MessageDlg('Es konnte keine Internetverbindung festgestellt werden. Bitte prüfen Sie diese.', mtError, [mbOK], 0);
  if status=true then MessageDlg('Auf Grund von Fehlern des Servers müssen Sie kuzzeitig auf diesen Service verzichten. Ich bitte um Verständnis.', mtError, [mbOK], 0);
 end;
end;

procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
 application.Terminate;
end;

procedure TForm1.SpeedButton2Click(Sender: TObject);
begin
 form2.scrollingcredits1.animate:=true;
 form1.visible:=false;
 form2.visible:=true;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 application.Terminate;
end;

procedure TForm1.Timer2Timer(Sender: TObject);
begin
 status:=true;
  try
  edit1.text:=IdHTTP1.Get('http://mlutime.uni-halle.de/cgi-bin/meinberg.cgi');
  label1.caption:=copy(edit1.Text,447,10);
  label2.caption:=copy(edit1.Text,458,8);
 except
  timer1.Enabled:=false;
  if status=false then MessageDlg('Es konnte keine Internetverbindung festgestellt werden. Bitte prüfen Sie diese.', mtError, [mbOK], 0);
  if status=true then MessageDlg('Auf Grund von Fehlern des Servers müssen Sie kuzzeitig auf diesen Service verzichten. Ich bitte um Verständnis.', mtError, [mbOK], 0);
 end;
end;


end.

faux 20. Nov 2005 20:34

Re: .: Atomuhr :.
 
Ist das ein Fehler der DP, oder rückst du Code generell nur spartanisch ein? :roll:

Matze 20. Nov 2005 21:40

Re: .: Atomuhr :.
 
Eine Frage dazu (habe mir das Programm nicht angesehen):
Wenn man sich die Atomzeit aus dem Internet holt, nimmt die Übertragung ja ein wenig Zeit in Anspruch. Dann müsste es doch so sein, dass die Zeit, die dein Programm verarbeitet etwas nach geht, oder ist dies nicht der Fall?

Jelly 21. Nov 2005 01:30

Re: .: Atomuhr :.
 
Hi Chrissi,

ein paar generelle Einwände hätt ich da aber schon:


1.
Zitat:

Zitat von Chrissi91
Delphi-Quellcode:
edit1.text:=IdHTTP1.Get('http://mlutime.uni-halle.de/cgi-bin/meinberg.cgi');
label1.caption:=copy(edit1.Text,447,10);
label2.caption:=copy(edit1.Text,458,8);

Was machst Du denn wenn die Uni aus Halle morgen eine neue Seite mit neuem Layout ins Netz stellt. Meinst du wirklich dass dann Datum ab Position 447 und Zeit ab 458 zu finden ist. :gruebel:

2.
Warum nutzt Du überhaupt das http-Protokoll um die Zeit eines Servers auszulesen. Du benutzt doch die Indy Komponenten, und es gibt für diesen Zweck extra die TIdTime Klasse. Ist auch eine Demo dabei.

3. Es ist unsinnig jede Sekunde die Zeit auszulesen. Lese sie einmal aus, und solange dein Programm läuft, verfolge die korrekte Zeit direkt programmintern. So sehr wird die rechnerinterne Uhr nicht falsch gehen, solange dein Programm läuft. Alles andere frisst doch nur Resourcen.

4. Wie du hier fragst, so sollte man doch mal überlegen, inwiefern die Angabe bei deinem Verfahren über 1/10 oder gar 1/1000 Sekunden auch nur irgendwie von Bedeutung sein könnten.

faux 21. Nov 2005 06:05

Re: .: Atomuhr :.
 
Ich hätte auch noch eine Frage:
Wieso benutzt du ein TEdit (Edit1), obwohl du es immer auf Visible := False gestellt hast? :gruebel:

Grüße
Faux

Chrissi91 21. Nov 2005 06:53

Re: .: Atomuhr :.
 
Zitat:

Zitat von Jelly
Zitat:

Zitat von Chrissi91
Delphi-Quellcode:
edit1.text:=IdHTTP1.Get('http://mlutime.uni-halle.de/cgi-bin/meinberg.cgi');
label1.caption:=copy(edit1.Text,447,10);
label2.caption:=copy(edit1.Text,458,8);

Was machst Du denn wenn die Uni aus Halle morgen eine neue Seite mit neuem Layout ins Netz stellt. Meinst du wirklich dass dann Datum ab Position 447 und Zeit ab 458 zu finden ist. :gruebel:

Ganz einfach, das System nutze ich schon seit Jahr ... da hat sich noch nie etwas geändert ;)

Zitat:

Zitat von Jelly
Warum nutzt Du überhaupt das http-Protokoll um die Zeit eines Servers auszulesen. Du benutzt doch die Indy Komponenten, und es gibt für diesen Zweck extra die TIdTime Klasse. Ist auch eine Demo dabei.

Werd ich mir mal anschauen.

Zitat:

Zitat von Jelly
Es ist unsinnig jede Sekunde die Zeit auszulesen. Lese sie einmal aus, und solange dein Programm läuft, verfolge die korrekte Zeit direkt programmintern. So sehr wird die rechnerinterne Uhr nicht falsch gehen, solange dein Programm läuft. Alles andere frisst doch nur Resourcen.

Habe ich schon in der letzten Version geändert. Nur der Code ist noch der alte.


Zitat:

Zitat von faux
Wieso benutzt du ein TEdit (Edit1), obwohl du es immer auf Visible := False gestellt hast? :gruebel:

In der vorletzten Version hatte ich noch ein Edit als "Variable". Habe ich aber auch schon geändert.

Zitat:

Zitat von Matze
Wenn man sich die Atomzeit aus dem Internet holt, nimmt die Übertragung ja ein wenig Zeit in Anspruch. Dann müsste es doch so sein, dass die Zeit, die dein Programm verarbeitet etwas nach geht, oder ist dies nicht der Fall?

Ja, aber das ist bei jedem Rechner unterschiedlich ;) Bei einem 56 K Modem und einem Pentium 1 Rechner müsste ich schon 3 Sekunden dazu rechnen ;) bei einem 3,6 GHz Rechner mit DSL 6000 sinds aber nur ein paar 100stel Sekunden ;)

Chrissi91

Jelly 21. Nov 2005 07:31

Re: .: Atomuhr :.
 
Zitat:

Zitat von Chrissi91
Ganz einfach, das System nutze ich schon seit Jahr ... da hat sich noch nie etwas geändert ;)

Na dann bin ich ja beruhigt. :wall:

MathiasSimmack 21. Nov 2005 07:39

Re: .: Atomuhr :.
 
Ich merke mal an, dass das DateTime-Sample in den Win32-API-Tutorials (Kapitel "System") einen Weg zeigt, die Zeit von Servern aus dem Internet zu lesen. Inkl. Auswahl des Servers aus einer Liste in einer INI-Datei. Vielleicht wäre das ja ein Punkt für eine der nächsten Versionen.

Chrissi91 21. Nov 2005 14:09

Re: .: Atomuhr :.
 
Nehme ich gerne mit auf. Hab ich wenigstens eine Beschäftigung bis zum Wochenende ... ;)

TeronG 21. Nov 2005 14:49

Re: .: Atomuhr :.
 
da möcht ich mal an Luckies Atomuhr verweisen ... mit so richtig Serverwahl, Zeitserver & Co.

Chrissi91 21. Nov 2005 14:54

Re: .: Atomuhr :.
 
Link wäre nicht schlecht :lol:

ichbins 21. Nov 2005 15:01

Re: .: Atomuhr :.
 
hmmm... bei der Version ohne XPStyle ist der XPStyle dabei...

Die Komponente xpman ist nämlich garnicht so wichtig für den XPStyle. Der XPStyle ist in wirklichkeit in einer res-Datei vorhanden, die per Unit xpman eingebunden wird. Du musst diese Unit aus den Uses rausnehmen.

zum Link: geh einfach auf luckies homepage http://www.luckie-online.de und such dir das Programm raus.

St.Pauli 21. Nov 2005 16:10

Re: .: Atomuhr :.
 
Zitat:

Zitat von Chrissi91
Zitat:

Zitat von Matze
Wenn man sich die Atomzeit aus dem Internet holt, nimmt die Übertragung ja ein wenig Zeit in Anspruch. Dann müsste es doch so sein, dass die Zeit, die dein Programm verarbeitet etwas nach geht, oder ist dies nicht der Fall?

Ja, aber das ist bei jedem Rechner unterschiedlich ;) Bei einem 56 K Modem und einem Pentium 1 Rechner müsste ich schon 3 Sekunden dazu rechnen ;) bei einem 3,6 GHz Rechner mit DSL 6000 sinds aber nur ein paar 100stel Sekunden ;)

Du darfst die Zeit nicht schätzen, du musst sie messen...

Tubos 21. Nov 2005 16:19

Re: .: Atomuhr :.
 
Zitat:

Ja, aber das ist bei jedem Rechner unterschiedlich Bei einem 56 K Modem und einem Pentium 1 Rechner müsste ich schon 3 Sekunden dazu rechnen bei einem 3,6 GHz Rechner mit DSL 6000 sinds aber nur ein paar 100stel Sekunden
Was hat die Round Trip Time mit der Rechengeschwindigkeit des sendenden Rechners zu tun?
Und mit der Bandbreite hat sie nicht direkt etwas zu tun.

Am besten verwendest du NTP, das Protokoll enthält einen Algorithmus der unabhängig von der Pingzeit eine genaue Synchronisierung ermöglicht. Ich glaube, bei den Indys ist eine NTP-Komponente dabei.

hardy1234 19. Feb 2006 06:27

Re: .: Atomuhr :.
 
Zitat:

Zitat von Tubos
Zitat:

Ja, aber das ist bei jedem Rechner unterschiedlich Bei einem 56 K Modem und einem Pentium 1 Rechner müsste ich schon 3 Sekunden dazu rechnen bei einem 3,6 GHz Rechner mit DSL 6000 sinds aber nur ein paar 100stel Sekunden
Was hat die Round Trip Time mit der Rechengeschwindigkeit des sendenden Rechners zu tun?
Und mit der Bandbreite hat sie nicht direkt etwas zu tun.

Am besten verwendest du NTP, das Protokoll enthält einen Algorithmus der unabhängig von der Pingzeit eine genaue Synchronisierung ermöglicht. Ich glaube, bei den Indys ist eine NTP-Komponente dabei.

Naja, den Indys trau ich auch nicht immer. Man kann auch die Internetzeit 20mal holen und den Mittelwert der Abfragezeit bilden. Das kann man dann durch synctime:= synctime + InetTimeDiff div 2 errechenen. Anders machen das die Indys auch nicht.

T3rm1n4T0r 19. Feb 2006 17:18

Re: .: Atomuhr :.
 
Ich frage mich, wie man das Atomuhr nennen kann. Wenn du die Zeit von irgendeinem Server abfragst, dann hat man doch immer eine gewisse Verzögerung. Auch wenn das nur 13 ms sind, so sind das bei einer Atomuhr doch recht viel.

Cöster 4. Jul 2006 14:39

Re: .: Atomuhr :.
 
Zitat:

Zitat von Chrissi91
Zitat:

Zitat von Jelly
Zitat:

Zitat von Chrissi91
Delphi-Quellcode:
edit1.text:=IdHTTP1.Get('http://mlutime.uni-halle.de/cgi-bin/meinberg.cgi');
label1.caption:=copy(edit1.Text,447,10);
label2.caption:=copy(edit1.Text,458,8);

Was machst Du denn wenn die Uni aus Halle morgen eine neue Seite mit neuem Layout ins Netz stellt. Meinst du wirklich dass dann Datum ab Position 447 und Zeit ab 458 zu finden ist. :gruebel:

Ganz einfach, das System nutze ich schon seit Jahr ... da hat sich noch nie etwas geändert ;)

Darauf würde ich mich aber nicht unbedingt verlassen. Mach's doch so, dann kannst du dir immer sicher sein:
Delphi-Quellcode:
i:=0;
repeat
 i:=i+1;
until (Edit1.Text[i+2]=':') and (Edit1.Text[i+5]=':');
Label2.Caption:=Copy(edit1.Text,i,8);

Luckie 4. Jul 2006 14:40

Re: .: Atomuhr :.
 
Und warum wird nicht die Indy Komponente genommen, die direkt die Zeit von einem Zeitserver holt?

negaH 4. Jul 2006 16:07

Re: .: Atomuhr :.
 
Interessantes Thema !

1.) müssen wir uns fragen was wir mit dieser Atomzeit genauerer machen wollen als es schon ist. Man kann davon ausgehen das auf heutigen Rechnern die Zeit durch das BIOS "gemessen" wird. Das ist dann ein RTC Chip der mit ca. 1.6MHz getaktet wird. Dieser Quartz hat eine Ungenauigkeit von +-10ppm. Das ergäbe hoch gerechnet eine Ungenauigkeit von +-1 Sekunde innerhalb von 44.4 Stunden. Wollen wir es 100'tel Sekunden genau also dann 26.6 Minuten. Daraus ergibt sich die minimal notwenige Synchromisationszeit von ca. 30 Minuten. Du solltest also alle 30 Minuten die Systemzeit synchronisieren, ein kürzeres Interval wäre nicht mehr meßbar noch hätte es einen Sinn.

2.) wie synchronisieren wir die Systemzeit so das wir sie exakt zum richtigen Zeitpunkt nachjustieren ? Das geht nur wenn du den Zeitfehler der Systemzeit ausrechnen kannst. Das muß dann folgende Fehlerquellen ausgleichen:
a.) Antwortzeiten im Netzwerk, ergo du musst diesen Fehler absolut messen können
b.) Gangungenauigkeiten des Quarzes der RTC
c.) eventl. Laufzeitdifferenzen der beteiligten BIOS und Betriebsystem Software

Das bedeutet: du musst ab dem Moment der Synchronisation mit dem Zeitserver die Zeit mit Hilfe der Systemuhr stoppen und diesen Wert als Differenz zur empfangenen Serverzeit so hochrechnen das du den exakten Zeitpunkt wann und mit welchem Zeitoffset du die Systemzeit aktualisierst.

Bleibt noch ein gravierendes Problem: nämlich die Genauigkeit der zeitlichen Ausführungspriorität deines Codes der die Systemzeit ändert. Sprich ein Task wir von OS nur mit Zeitscheiben an Prozessorzeit ausgeführt, und das OS kann mittendrinnen in deiner Aktuialiserung der Systemzeit deinen Task schlafen legen. Du kannst das mit höheren Prioritäten versuchen zu verhindern, aber real verlassen kannst du dich nur darauf das due einen zeitlichen Fehler von +-20 Millisekunden hast. Sogesehen auf 100'tel Sekunden genau zu synchroniseren ist meiner Meinung nach schon hart an der Grenze des Machbaren.

Gruß Hagen


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:55 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz