![]() |
.: 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 |
Re: .: Atomuhr :.
Zitat:
Hab mir dein Programm nicht angesehen, aber ich denke nicht das es das ^^ bereits tut. ;) |
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. |
Re: .: Atomuhr :.
Also das mit der Systemzeit umstellen, versuche ich, aber ich schaffe das nicht so richtig (s.
![]() Code muss ich erst mal richtig einrücken und so ... kommt nachher :lol: |
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.
|
Re: .: Atomuhr :.
Version 1.0.2 im ersten Beitrag. Änderungen habe ich dort auch aufgelistet.
|
Re: .: Atomuhr :.
:kotz:
![]() |
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.
|
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:
|
Re: .: Atomuhr :.
zeig mal einen Screenshot.
Ohne Timer geht das so:
Delphi-Quellcode:
//edit: du musst die colors von der Buttoncaption auf clblack setzten. welche Komponente verwendest du denn für die Buttons?
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; |
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
|
Re: .: Atomuhr :.
Zitat:
Zitat:
|
Re: .: Atomuhr :.
hundertstelsekunden. Für Millisekunden ist tdatetime zu ungenau.
|
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 ;) |
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 |
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. |
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 ;) |
Re: .: Atomuhr :.
Zitat:
Weißen Pixelrand änder ich |
Re: .: Atomuhr :.
Zitat:
Ansonsten ein nettes Progrämmchen! - Mich würd der Code interessieren. |
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. |
Re: .: Atomuhr :.
Ist das ein Fehler der DP, oder rückst du Code generell nur spartanisch ein? :roll:
|
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? |
Re: .: Atomuhr :.
Hi Chrissi,
ein paar generelle Einwände hätt ich da aber schon: 1. Zitat:
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 ![]() |
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 |
Re: .: Atomuhr :.
Zitat:
Zitat:
Zitat:
Zitat:
Zitat:
Chrissi91 |
Re: .: Atomuhr :.
Zitat:
|
Re: .: Atomuhr :.
Ich merke mal an, dass das DateTime-Sample in den
![]() |
Re: .: Atomuhr :.
Nehme ich gerne mit auf. Hab ich wenigstens eine Beschäftigung bis zum Wochenende ... ;)
|
Re: .: Atomuhr :.
da möcht ich mal an Luckies Atomuhr verweisen ... mit so richtig Serverwahl, Zeitserver & Co.
|
Re: .: Atomuhr :.
Link wäre nicht schlecht :lol:
|
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 ![]() |
Re: .: Atomuhr :.
Zitat:
|
Re: .: Atomuhr :.
Zitat:
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. |
Re: .: Atomuhr :.
Zitat:
|
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.
|
Re: .: Atomuhr :.
Zitat:
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); |
Re: .: Atomuhr :.
Und warum wird nicht die Indy Komponente genommen, die direkt die Zeit von einem Zeitserver holt?
|
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 14:16 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz