AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte Programm Wurzelberechnung nach Heron
Thema durchsuchen
Ansicht
Themen-Optionen

Programm Wurzelberechnung nach Heron

Ein Thema von EdAdvokat · begonnen am 14. Jan 2017 · letzter Beitrag vom 19. Jan 2017
Antwort Antwort
nahpets
(Gast)

n/a Beiträge
 
#1

AW: Programm Wurzelberechnung nach Heron

  Alt 18. Jan 2017, 16:16
Also ehrlich, diese Bedingung ist noch nicht erfüllt:
Zitat:
(sekundengenau, also nicht einmal irgendwann innerhalb einer Sekunde, sondern pünktlich zum Beginn jeder Sekunde)
Die Millisekunden sind nie 0, sondern immer (während der Programmlaufzeit) eine annähernd gleichbleibende Zahl <> 0.
(Erhöht sich pro Minute um ca. 2 bis 3 Millisekunden.)

D. H.: Die Zeit wird nach jeweils einer Sekunde aktuallisiert, aber nicht zum Beginn der Sekunde, sondern "mitten drin"

Da der Timer von Delphi nur eine kleinste Auflösung von einer Millisekunde hat, sei hier ein Fehler von +/- einer Millisekunde akzeptiert.

ff
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.739 Beiträge
 
Delphi 6 Enterprise
 
#2

AW: Programm Wurzelberechnung nach Heron

  Alt 18. Jan 2017, 16:57
Da der Timer von Delphi nur eine kleinste Auflösung von einer Millisekunde hat, sei hier ein Fehler von +/- einer Millisekunde akzeptiert.
Dies ist aber sehr großzügig
Ralph
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#3

AW: Programm Wurzelberechnung nach Heron

  Alt 18. Jan 2017, 17:01
Da der Timer von Delphi nur eine kleinste Auflösung von einer Millisekunde hat, sei hier ein Fehler von +/- einer Millisekunde akzeptiert.
Dies ist aber sehr großzügig
Ja, geht aber
  Mit Zitat antworten Zitat
EdAdvokat

Registriert seit: 1. Mai 2016
Ort: Berlin
419 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#4

AW: Programm Wurzelberechnung nach Heron

  Alt 18. Jan 2017, 17:07
da bin ich erst einmal platt, denn zwischenzeitlich habe ich den Düsseldorfer Fernsehturm ins Formular bekommen und auch die entsprechende Durchsicht auf ein darunter liegendes Formulare hinbekommen mit den roemischen Anzeigen auf dem Rumpf des Turmes und glaubte mich fast am Ziel.
Doch wie ich diese geforderte Genauigkeit hinbekommen könnte ist mir überhaupt nicht klar, denn ich dachte das klappt über den Timer von Delphi mit der gegenwärtigen Einstellung. Kann mir da ein Wink gegeben werden?
Norbert
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#5

AW: Programm Wurzelberechnung nach Heron

  Alt 18. Jan 2017, 17:17
Na klar kann ich 'nen Tipp geben.
Sonst hätt' ich ja nicht 'ne so blödsinnige Forderung gestellt.

Am Beginn des Timerereignisses diesen ausschalten.
Arbeit machen.
Zeit bis zur nächsten vollen Sekunde berechnen.
Timerintervall entsprechend setzen.
Timer einschalten.

Achso: Für die Zeitangaben reicht aber eigentlich ein Timer aus.
Und die Zeit sollte man im Laufe der Ereignisabarbeitung nicht mehrfach auslesen, es könnten dann (marginale) Abweichungen auftreten
  Mit Zitat antworten Zitat
EdAdvokat

Registriert seit: 1. Mai 2016
Ort: Berlin
419 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#6

AW: Programm Wurzelberechnung nach Heron

  Alt 18. Jan 2017, 18:03
ich stehe im winterlichen Nebel(also es ist kalt und ich sehe keinen Horizont) und nirgends ist ein blinkender Fernsehturm erkennbar. Also die Hinweise zum Timer (nur einen) habe ich berücksichtigt.
Doch was ich ggf. berechnen sollte ist mir überhaupt nicht klar. Ich habe nicht einmal einen Ansatzpunkt, worüber ich nachdenken könnte.
Am Beginn des Timergerg. Timer aus; wo genau? Arbeit machen? welche denn? Zeit bis zur neuen Sec berechnen? wie das den bitte? Dementsprechend Timerintervall setzen; wäre schön, wenn ich da angekommen wäre! Timer anstellen, das würde mir sicher gelingen mit Timer.enabled:=true das ist wohl das einzige was ich an dieser Stelle könnte, doch den Timer ausschalten könnte ich wohl auch.
Es ist mir auch wirklich nicht klar, was konkret unabhängig von der Programmierung, die Aufgabe an dieser STelle ist. Das Ding läuft doch so vor sich hin und zeigt die Zeit sogar in roemischen Zahlen!
Norbert
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#7

AW: Programm Wurzelberechnung nach Heron

  Alt 18. Jan 2017, 18:58
Also, damit ein Timer arbeitet, muss irgendwo Enabled auf True gesetzt worden sein. Das kann im Objektinspektor sein oder im Quelltext.

Im Timerereignis nun zu beginn den Timer ausschalten, also Enabled auf false.

Jetzt wird ja allerlei im Ereignis gemacht. Zeit ermitteln, in römische Zahlen umwandeln, zur Anzeige bringen ...

Dabei vergeht ja etwas Zeit. Bis zur nächsten vollen Sekunde (für die nächste Anzeige ...) besteht nun noch eine Zeitdifferenz von x Millisekunden (> 0 und < 999).
Das Timerintervall ist im Objektinspektor (vermutlich) auf 1000 gesetzt. Die verbleibende Zeit bis zur nächsten vollen Sekunde ist aber nicht immer 1000 Ms. Daher muss hier die Zeitspanne zwischen Jetzt und der nächsten vollen Sekunden berechnet werden. Dieser Wert muss dann dem Timerintervall zugewiesen werden und anschließend Enabled wieder auf True gesetzt werden.

Warum reite ich auf dem ganzen (hier im konkreten Fall) Quatsch rum?

Stell' Dir vor, Du musst in regelmäßigen Abständen eine bestimmte Aufgabe erledigen. Z. B. genau zu jeder vollen Minute. Aber es kommt erschwerend hinzu: Unter bestimmten, ungünstigen, Bedingungen dauert die Erledigung der Aufgabe länger als eine Minute. Ein permanent laufender Timer, der stoisch alle 60000 MS "zuschlägt", würde also die Timerroutine bereits aufrufen, während die vorherige noch abgearbeitet wir. Das sollte verhindert werden.

Da nicht bekannt ist, wie lange nun die Abarbeitung der Aufgabe in jedem Einzellfall dauert, kann man hier also nicht mit einem statischen Timerintervall arbeiten.
Am Ende der Aufgabe muss also die Anzahl der Millisekunden bis zur nächsten vollen Minute berechnet werden, das Timerinterval entsprechend gesetzt werden und dann der Timer aktiviert werden.

Oder mal einfach so als Spasserweiterung für Deine Uhr.

Der Timer setzt jede Sekunde "Alles". Das Datum ändert sich aber nur einmal täglich.

Dafür könnte man auch einen Timer nehmen. Beim Programmstart wird die Timerroutine einmal aufgerufen und dort wird dann die verbleibende Zeit in Millisekunden bis 0 Uhr berechnet, das Timerintervall gesetzt und der Timer eingeschaltet.
Damit wird das Datum nur noch einmal täglich um 0 Uhr gesetzt.
Nimm einfach mal an, dass Du da nicht einfach nur Text auf ein Label schreibst, sondern über eine Schnittstelle eine große mechanische Anzeigetafel ansteuern musst, dann ist es schon eine Überlegung wert, ob man das wirklich jede Sekunde macht oder nur wenn sich das Datum ändert.

Als Spielerei könnte man jetzt ja auch noch einen Timer nehmen, der nur für die Anzeige der vollen Stunde zuständig ist.

Und einen, der nur für die Anzeige der vollen Minuten zuständig ist.

Und als letztes den für die Sekunden.

Klar ist das für 'ne einfach Uhr völlig überdimensioniert, aber mal mit Zeiten rechnen und Zeitdifferenzen ermitteln, um damit ein bestimmtes, in der Zukunft liegendes, zu einem konkreten Zeitpunkt auszulösendes, Ereignis in Gang zubringen, ist schon 'ne Lernaufgabe
  Mit Zitat antworten Zitat
EdAdvokat

Registriert seit: 1. Mai 2016
Ort: Berlin
419 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#8

AW: Programm Wurzelberechnung nach Heron

  Alt 18. Jan 2017, 20:22
ich habe die Zeitdifferenz gesondert gemessen. Sie beträgt 0 ms.

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  Present: TDateTime;
  Year, Month, Day, Hour, Min, Sec, MSec: Word;
  Zeit : String;
  startTime: Cardinal;
begin
  timer2.Enabled:=false;

  startTime := GetTickCount;

  //Befehlesfolge deren Zeitdauer bestimmt werden soll
    Present:= Now;
  SysUtils.DecodeDate(Present, Year, Month, Day);
  Label1.Caption := 'Der heutige Tag ist der ' + Dezinroem(IntToStr(Day)) + ' des '+Dezinroem(inttoStr(Month)) +'. Monates '
     + ' des Jahres ' + DezinRoem(IntToStr(Year));

  SysUtils.DecodeTime(Present, Hour, Min, Sec, MSec);
  Label2.Caption := DezInRoem(inttostr(Hour))+ ' Stunden, '+DezInRoem(inttostr(Min))+' Minuten und '
     +DezinRoem(inttostr(Sec))+' Sekunden und '+DezinRoem(inttostr(MSec)) +' Milisekunden';
  Label4.Caption:=DezInRoem(inttostr(Hour));
  Label5.caption:=DezInRoem(inttostr(Min));
  Label6.caption:=DezInRoem(inttostr(Sec));
  Label7.caption:=DezInRoem(inttostr(mSec));

  ShowMessage('Die Routine benötigte etwa ' + DezInRoem(IntToStr(GetTickCount - startTime)) + 'ms');

  timer2.Enabled:=true;
end;
Ich habe sie jedoch nur ohne Umwandlung in roem. Zahlen gemessen, da so wie oben geschrieben kein Wert ausgegeben wird.
Also ist alles so wie bislang geschrieben?
Habe ich nun den richtigen Ansatz für die Berechnung der Zeitdifferenz? Wie gibt man eigentlich eine Null in roem. Zahlen aus?
Das Problem übersteigt wohl doch meine Möglichkeiten.
Norbert
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#9

AW: Programm Wurzelberechnung nach Heron

  Alt 18. Jan 2017, 21:21
Bei den römischen Zahlen gibt es keine 0, kann von daher auch nicht ausgegeben werden

Was ich mit der Intervallberechnung bezwecken möchte, mal ein Beispiel:

Das Programm wird um 21:36:45,567 gestartet und soll zu jeder vollen Sekunde ein Timerereignis ausführen.

Wir benötigen hier also die Anzahl der Millisekunden zwischen

21:37:00,000
und
21:36:45,567

Das wäre das Timerintervall, das gesetzt werden müsste.

Klar, bei so einer Aufgabe, wie der Ausgabe der Uhrzeit, ist die Laufzeit so kurz, dass eine Neuberechnung absurd erscheint.
Wenn Du Deine Uhr aber mal über einen längeren Zeitraum laufen lässt, wirst Du bemerken, dass die Zahl der Millisekunden langsam, aber kontinuierlich, ansteigt.
Bei meinem Rechner zwischen 2 und 3 Millisekunden pro Minute, das sind am Tag irgendwas zwischen 2880 und 4320 Millisekunden.

Auf's Jahr gerechnet werden daraus zwischen 1051200 und 1576800 Millisekunden, gibt also sowas um die 20 Sekunden. Hier wäre es schön, wenn die Uhr diesen Fehler selbst korrigieren könnte. Dazu muss halt ab und an das Timerintervall etwas kürzer als 1000 Millisekunden sein. So, wie es auf meinem Rechner aussieht, zwei bis dreimal pro Minute.

Hier mal ein paar Fragmente aus 'ner von TTimer abgeleiteten Komponente von mir:
Delphi-Quellcode:
const
  iOneSecond : Integer = 1000; // eine Sekunde in Millisekunden
  iFiveSeconds : Integer = 5000; // fünf Sekunden in Millisekunden
  iFifteenSeconds : Integer = 15000; // fünfzehn Sekunden in Millisekunden
  iOneMinute : Integer = 60000; // eine Minute in Millisekunden
  iFiveMinutes : Integer = 300000; // Fünf Minuten in Millisekunden
  iFifteenMinutes : Integer = 900000; // Fünfzehn Minuten in Millisekunden
  iOneHour : Integer = 3600000; // Eine Stunde in Millisekunden
  iOneDay : Integer = 86400000; // Ein Tag in Millisekunden

function TSpecialTimer.CalcTimerInterval(iTimerInterval : Integer) : Integer;
Var
          dNow : Double;
begin
  // Interval setzen
  // Tagesdatum und Uhrzeit holen
  dNow := Now;
  // Den Tagesanteil holen (= Nachkommastellen).
  dNow := dNow - Trunc(dNow);
  // Rest bis Mitternacht holen.
  dNow := 1 - dNow;
  // Nachkommastellen mal Millisekunden pro Tag
  Result := Trunc(dNow * iOneDay);
  // wir benötigen den Rest bis zum angegeben Interval, damit der Timer
  // zur nächsten Minute, Stunde, 0 Uhr ... aktive wird.
  Result := (Result mod Max(iTimerInterval,1));
end;
Der Aufruf könnte dann z. B. so erfolgen:
Delphi-Quellcode:
// Damit der Timer zur nächsten vollen Sekunde ausgelöst wird:
Timer1.Interval := CalcTimerInterval(iOneSecond);
// Zur nächsten vollen Viertelstunde, um den Glockenschlag für die Viertelstunde auszulösen:
Timer2.Interval := CalcTimerInterval(iFifteenMinutes);
// Oder um Mitternacht, z. B. für den Datumswechsel:
Timer3.Interval := CalcTimerInterval(iOneDay);
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:40 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