Hallo, liebe Leute,
ich möchte in ein Programm eine Stoppuhr einbauen, möglichst auch mit Sekundenbruchteilen.
Gibt es da schon fertige Prozeduren und/oder Funktionen in irgendwelchen units, oder hat jemand ein paar Tips, wie ich mir so etwas relativ leicht selbst basteln kann?
Danke im Voraus für evtl. Antworten!
Fröhliche Grüße Roland
On 02.05.2010 13:00, Roland Goretzki wrote:
Hallo, liebe Leute,
ich möchte in ein Programm eine Stoppuhr einbauen, möglichst auch mit Sekundenbruchteilen.
Gibt es da schon fertige Prozeduren und/oder Funktionen in irgendwelchen units, oder hat jemand ein paar Tips, wie ich mir so etwas relativ leicht selbst basteln kann?
Für gpc selbst habe ich dergleichen zwar nicht, aber für tcl/tk (siehe Anhang {sek10... ist die Zehnerstelle der Sekunden}). Sekundenbruchteile sind zwar nicht implementiert, die Idee sollte aber hoffentlich aus dem Zusammenhang hervorgehen (after 1000: nach 1000 ms). tcl lässt sich normalerweise recht gut in andere Programmiersprachen einbetten...
möge die Übung gelingen!
Danke im Voraus für evtl. Antworten!
Fröhliche Grüße Roland
Hallo Liste, hallo Olaf,
Du schriebst:
On 02.05.2010 13:00, Roland Goretzki wrote:
[ ... ] ich möchte in ein Programm eine Stoppuhr einbauen, möglichst auch mit Sekundenbruchteilen. [ ... ]
Für gpc selbst habe ich dergleichen zwar nicht, aber für tcl/tk (siehe Anhang {sek10... ist die Zehnerstelle der Sekunden}). Sekundenbruchteile sind zwar nicht implementiert, die Idee sollte aber hoffentlich aus dem Zusammenhang hervorgehen (after 1000: nach 1000 ms). tcl lässt sich normalerweise recht gut in andere Programmiersprachen einbetten...
Oh je ... :-) Nein, zunächst erst einmal Danke!
Du kannst ja nicht wissen, daß ich kein Programmierer bin und nur teilweise recht brauchbare Anfänger-Erfahrungen beim Programmieren mit Pascal habe (abgesehen von einfachsten shell-scripts die einzige Sprache, mit der ich mich bisher befaßt habe).
Darüberhinaus lediglich rudimentäre Kenntnisse über cgi, gerade soviel, wie ich bisher dringend für mein Projekt benötigt habe.
So wird es für mich eine neue Herausforderung, von der ich noch nicht weiß, ob ich ihr überhaupt gewachsen bin, wenn ich nun eine Prozedur aus einer anderen Sprache in mein Pascal-Programm implementieren soll.
Im Moment habe ich überhaupt keinen blassen Schimmer. :-#
Könnte ich dafür hier auch noch Hinweise bekommen?
möge die Übung gelingen!
Danke! :-)
Wen's interessiert: Das Programm ist ein Projekt zum Trainieren des Notenlesens und enthält seit neuestem auch eine Übung zum Hören von Noten.
Zum größeren Anreiz möchte ich für die Übungen diese Stoppuhr einbauen.
Das Programm läuft bereits im Netz unter
http://www.roland-goretzki.de/cgi-bin/notenhoeren.cgi
Benutzernamen und Paßwort würde ich bei Interesse in gesonderter E-Mail an die private E-Mail-Adresse versenden.
Fröhliche Grüße Roland
Roland Goretzki schrieb:
ich möchte in ein Programm eine Stoppuhr einbauen, möglichst auch mit Sekundenbruchteilen.
Gibt es da schon fertige Prozeduren und/oder Funktionen in irgendwelchen units, oder hat jemand ein paar Tips, wie ich mir so etwas relativ leicht selbst basteln kann?
[...]
Das Programm läuft bereits im Netz unter
http://www.roland-goretzki.de/cgi-bin/notenhoeren.cgi
Ich nehme an, du willst dann die Zeit zwischen zwei Programmaufrufen messen, richtig? (Bei CGI-Programmen bedeutet ja jeder Seitenaufruf einen Programmaufrufen.) Eine laufende Uhr im Browser des Benutzers ist so nicht darstellbar. (Das geht wohl am besten mit JavaScript oder so ...)
GPC hat (in der Unit GPC) die Funktion:
function GetMicroSecondTime: MicroSecondTimeType;
Der Rückgabewert ist die Zeit in µs seit 1.1.1970 0:00 UTC. Man könnte also beim 1. Aufruf den Wert speichern und beim 2. Aufruf die Differenz zum aktuellen Wert berechnen.
Die Genauigkeit ist hier natürlich durch das Netz beschränkt. Je nach Anbindung des Benutzers und Komplexität der Seite kann schon die Übertragung und der Aufbau der Seite Sekunden dauern, sodass die Anzeige von Sekundenbruchteilen wenig aussagekräftig wäre. Aber für schnelle Verbindungen und einfache Seiten vielleicht immerhin Zehntelsekunden ...
Frank
Hallo Liste, hallo Frank,
Du schriebst:
Roland Goretzki schrieb:
ich möchte in ein Programm eine Stoppuhr einbauen, möglichst auch mit Sekundenbruchteilen. [...] Das Programm läuft bereits im Netz unter http://www.roland-goretzki.de/cgi-bin/notenhoeren.cgi
Ich nehme an, du willst dann die Zeit zwischen zwei Programmaufrufen messen, richtig? (Bei CGI-Programmen bedeutet ja jeder Seitenaufruf einen Programmaufrufen.)
Ja, so ist es. (Beides ;-)
Eine laufende Uhr im Browser des Benutzers ist so nicht darstellbar. (Das geht wohl am besten mit JavaScript oder so ...)
Eine laufende Uhr, die angezeigt wird, brauche ich nicht: Es soll nur die Zeit bis zur Erfüllung einer gewissen Anforderung gemessen und anschließend ausgegeben und/oder zur weiteren Verarbeitung gespeichert werden.
Inzwischen habe ich in einem Versuchsprogramm eine Uhr auf Sekundenbasis eingebaut, die auch bisher einwandfrei funktioniert.
Einziger "Nachteil": Sie darf nicht länger als 24 Stunden laufen, sonst zeigt sie die gemessene Zeit minus dem Überschuß an Tagen an, was aber für meine Zwecke, wo es um Übungen geht, die höchstens einige Minuten dauern, egal ist.
Sie basiert auf GetTimeStamp.
Diese Uhr zu bauen, war für mich eine Riesenanstrengung (das soll keine Klage sein, sondern nur ein Hinweis darauf, daß das Programmieren mir doch noch sehr, sehr schwer fällt, auch wenn es Freude macht :-), obwohl ich sie eigentlich vor Jahren schon einmal für ein anderes Programm gebastelt hatte, für welches sie auch tauglich war.
Aber dort konnte ich einige Fehler ausmachen, die sich damals scheinbar nicht ausgewirkt haben.
Nun ist sie entsprechend meinen Fähigkeiten sauberer programmiert. Zur evtl. Begutachtung hänge ich sie an diese E-Mail an.
Beim Versuch, sie auf Mikrosekundenbasis aufzubauen, was, so weit ich das beurteilen kann, sicherlich auch geht (weil sich mit GetTimeStamp ja auch die Mikrosekunden erfassen lassen), bin ich allerdings steckengeblieben.
GPC hat (in der Unit GPC) die Funktion:
function GetMicroSecondTime: MicroSecondTimeType;
Der Rückgabewert ist die Zeit in µs seit 1.1.1970 0:00 UTC. Man könnte also beim 1. Aufruf den Wert speichern und beim 2. Aufruf die Differenz zum aktuellen Wert berechnen.
Du kannst eben doch hellsehen: So etwas habe ich gesucht. :-)
Damit hätte ich sie gebaut, wenn ich das eher gewußt hätte. Das ist doch für Pascal dasselbe wie "date +%s" für die shell, außer daß es eben auch mit Mikrosekunden läuft, oder?
Vielleicht baue ich damit ja trotzdem noch eine Uhr, mir scheint, daß es damit einfacher gehen könnte.
Mit "date +%s" habe ich mir schon vor Jahren einige Scripts für das Klavierüben gebastelt, die folgendes tun:
Wenn ich übe, öffne ich die Datei für das Musikstück, welches ich gerade üben will, drücke (das habe ich mir im vi so eingerichtet) die 9, die Zeit wird gemessen (diese unix-Zeit ab 1970), und ein entsprechender Text wird in die Datei eingetragen.
Wenn ich aufhöre zu üben, drücke ich die 8, die Zeit wird wieder gemessen und entsprechender weiterer Text wird eingetragen, der auch die abgelaufene Zeit seit der ersten Messung enthält.
Dabei kommt es ja auch wirklich nicht auf Sekundenbruchteile an.
Die Genauigkeit ist hier natürlich durch das Netz beschränkt. Je nach Anbindung des Benutzers und Komplexität der Seite kann schon die Übertragung und der Aufbau der Seite Sekunden dauern, sodass die Anzeige von Sekundenbruchteilen wenig aussagekräftig wäre.
Diese Gedanken hatte ich inzwischen auch schon. Außerdem hatte ich ja in der ersten E-Mail zu diesem Thread nur gesagt: "möglichst" auch mit Sekundenbruchteilen.
Aber für schnelle Verbindungen und einfache Seiten vielleicht immerhin Zehntelsekunden ...
Mehr hätte ich auch gar nicht gewollt. :-)
Jedenfalls Danke für die Antwort.
Fröhliche Grüße Roland
Roland Goretzki schrieb:
Inzwischen habe ich in einem Versuchsprogramm eine Uhr auf Sekundenbasis eingebaut, die auch bisher einwandfrei funktioniert.
Einziger "Nachteil": Sie darf nicht länger als 24 Stunden laufen, sonst zeigt sie die gemessene Zeit minus dem Überschuß an Tagen an, was aber für meine Zwecke, wo es um Übungen geht, die höchstens einige Minuten dauern, egal ist.
Sie basiert auf GetTimeStamp.
Diese Uhr zu bauen, war für mich eine Riesenanstrengung (das soll keine Klage sein, sondern nur ein Hinweis darauf, daß das Programmieren mir doch noch sehr, sehr schwer fällt, auch wenn es Freude macht :-), obwohl ich sie eigentlich vor Jahren schon einmal für ein anderes Programm gebastelt hatte, für welches sie auch tauglich war.
Dass es so eine Anstrengung war, liegt auch daran, dass TimeStamp und ähnliche Datentypen für solche Zwecke unpraktisch sind, weil Datum und Zeit zerlegt sind und du sie wieder zusammensetzen musst. (Du machst also einen Teil von dem, was GetTimeStamp gerade gemacht hat, wieder rückgängig.)
Im allgemeinen ist es sinnvoll, "zerlegte" Zeitformate für Ein- und Ausgabe zu verwenden und lineare, um mit Zeit zu rechnen (es sei denn, man rechnet mit Monaten oder Jahren -- dann ist wiederum die zerlegte Form einfacher, weil Monate und Jahre nicht gleich lang sind).
Zum Umwandlung gibt es natürlich auch Funktionen (wobei UnixTimeType in Sekunden, nicht µs, misst), sodass man für jeden Zweck das einfachere Format verwenden kann und sich normalerweise nicht sebst um die Umwandlung kümmern muss.
procedure UnixTimeToTimeStamp (UnixTime: UnixTimeType; var aTimeStamp: TimeStamp); function TimeStampToUnixTime (protected var aTimeStamp: TimeStamp): UnixTimeType;
Wenn du die Zeit sowohl ausgeben als auch damit rechnen willst, ist es besser, sie einmal auszulesen, z.B. mit GetMicroSecondTime, und dann umzuwandeln, statt sie nochmal mit GetTimeStamp auszulesen, weil zwischen den beiden Aufrufen ja ein paar Sekundenbruchteile vergehen, was u.U. zu inkonsistenten Ergebnissen führt.
Nun ist sie entsprechend meinen Fähigkeiten sauberer programmiert. Zur evtl. Begutachtung hänge ich sie an diese E-Mail an.
Zeit_Komponenten_Ausgabe und Gestoppte_Zeit_Ausgeben kannst du evtl. mit Hilfe von "FormatTime (SystemDatum, Format)" vereinfachen. Format ist dabei in der gleichen Form wie bei Date (ohne das "+", also z.B. "%m" für den Monat), Näheres steht in gpc.pas bei "FormatTime". V.a. das Einfügen der führenden Nullen geht damit einfacher (und das Format ist später jederzeit leicht änderbar -- nur ein String statt Programmcode).
Frank
Hallo Liste, hallo Frank,
Du schriebst:
Roland Goretzki schrieb:
[ ... ] Diese Uhr zu bauen, war für mich eine Riesenanstrengung (das soll keine Klage sein, sondern nur ein Hinweis darauf, daß das Programmieren mir doch noch sehr, sehr schwer fällt, auch wenn es Freude macht :-), obwohl ich sie eigentlich vor Jahren schon einmal für ein anderes Programm gebastelt hatte, für welches sie auch tauglich war.
[ ... ] Im allgemeinen ist es sinnvoll, "zerlegte" Zeitformate für Ein- und Ausgabe zu verwenden und lineare, um mit Zeit zu rechnen [ ... ]
Das habe ich auch schon festgestellt, ohne es gedanklich so konkret zu fassen, wie Du es jetzt ausgedrückt hast.
Zum Umwandlung gibt es natürlich auch Funktionen (wobei UnixTimeType in Sekunden, nicht µs, misst), sodass man für jeden Zweck das einfachere Format verwenden kann und sich normalerweise nicht sebst um die Umwandlung kümmern muss.
Genau das hatte ich schon gedacht, als ich in der ersten E-Mail schrieb: "Gibt es da schon fertige Prozeduren und/oder Funktionen ... "
procedure UnixTimeToTimeStamp (UnixTime: UnixTimeType; var aTimeStamp: TimeStamp); function TimeStampToUnixTime (protected var aTimeStamp: TimeStamp): UnixTimeType;
Wenn du die Zeit sowohl ausgeben als auch damit rechnen willst,
Genau das will ich.
ist es besser, sie einmal auszulesen, z.B. mit GetMicroSecondTime,
Was ich ja mit meiner neuesten Uhr (neu_stoppUhr) auch schon tue.
und dann umzuwandeln, statt sie nochmal mit GetTimeStamp auszulesen, weil zwischen den beiden Aufrufen ja ein paar Sekundenbruchteile vergehen, was u.U. zu inkonsistenten Ergebnissen führt.
Genau diese Umwandlung auf die von Dir vorgeschlagene Weise macht mir noch Schwierigkeiten, u.a. weil es für mich meistens noch problematisch ist, eine Prozedur oder Funktion aufzurufen, wenn sie etwas komplizierter ist:
Wie rufe ich z.B. UnixTimeToTimeStamp oder TimeStampToUnixTime auf, ohne doch noch einmal GetTimeStamp aufzurufen?
Könntest Du mir da bitte ein Beispiel für den Aufruf der Prozedur UnixTimeToTimeStamp geben?
Zeit_Komponenten_Ausgabe und Gestoppte_Zeit_Ausgeben kannst du evtl. mit Hilfe von "FormatTime (SystemDatum, Format)" vereinfachen.
Das dürfte ja nun entfallen, wenn ich nur mit GetMicroSecondTime arbeite, oder?
Bin mal gespannt ... :-)
Danke und Fröhliche Grüße Roland
Hallo Liste, hallo Frank,
Du schriebst:
Im allgemeinen ist es sinnvoll, "zerlegte" Zeitformate für Ein- und Ausgabe zu verwenden und lineare, um mit Zeit zu rechnen (es sei denn, man rechnet mit Monaten oder Jahren -- dann ist wiederum die zerlegte Form einfacher, weil Monate und Jahre nicht gleich lang sind).
Zum Umwandlung gibt es natürlich auch Funktionen (wobei UnixTimeType in Sekunden, nicht µs, misst), sodass man für jeden Zweck das einfachere Format verwenden kann und sich normalerweise nicht sebst um die Umwandlung kümmern muss.
procedure UnixTimeToTimeStamp (UnixTime: UnixTimeType; var aTimeStamp: TimeStamp);
Okay, mit UnixTimeToTimeStamp erziele ich jetzt brauchbare Ergebnisse (hat mich weitere 5 Stunden gekostet).
Und dann kommt wohl doch FormatTime zum Einsatz, anders als ich in meiner letzten E-Mail vermutete hatte.
Aber mit FormatTime komme ich ohne Hilfe anscheinend überhaupt nicht klar.
Wenn ich eingebe "FormatTime (SystemDatum, %m)", dann erzählt er mir was von "invalid character". So viel ich auch mehr oder weniger planlos damit herumspiele, erhalte ich doch immer nur Fehlermeldungen, mit denen ich nichts anfangen kann, ebensowenig wie mit den Erklärungen in gpc.pas bei "FormatTime".
Zeit_Komponenten_Ausgabe und Gestoppte_Zeit_Ausgeben kannst du evtl. mit Hilfe von "FormatTime (SystemDatum, Format)" vereinfachen. Format ist dabei in der gleichen Form wie bei Date (ohne das "+", also z.B. "%m" für den Monat), Näheres steht in gpc.pas bei "FormatTime". V.a. das Einfügen der führenden Nullen geht damit einfacher (und das Format ist später jederzeit leicht änderbar -- nur ein String statt Programmcode).
Ich kann mir sehr gut vorstellen, daß man mit diesen Möglichkeiten sehr flexibel umgehen kann.
Dazu müßte ich aber zunächst erst einmal überhaupt EIN EINZIGES funktionierendes Beispiel haben. Auf ein solches durch Ausprobieren zu kommen, scheint der Suche nach der Stecknadel im Heuhaufen zu ähneln.
Ich glaube, daß ich bis hierher viel gelernt habe, aber nun komme ich nicht mehr weiter und sollte wohl erst einmal schlafen gehen ...
Fröhliche Grüße Roland
Roland Goretzki schrieb:
Und dann kommt wohl doch FormatTime zum Einsatz, anders als ich in meiner letzten E-Mail vermutete hatte.
Ja, wenn du die Zeit auch ausgeben willst.
Aber mit FormatTime komme ich ohne Hilfe anscheinend überhaupt nicht klar.
Wenn ich eingebe "FormatTime (SystemDatum, %m)", dann erzählt er mir was von "invalid character".
Ach so, das %m muss in '' stehen. Es ist ein ganz normaler Pascal-String. (Natürlich kann man statt einer Konstante auch eine String-Variable verwenden.)
Dazu müßte ich aber zunächst erst einmal überhaupt EIN EINZIGES funktionierendes Beispiel haben.
Ich denke, es lag nur an den Anführungszeichen. Ansonsten unten ein etwas;-) komplizierteres Beispiel (mit dem ich mir in meinem Editor die Zeit anzeigen lasse).
Wie rufe ich z.B. UnixTimeToTimeStamp oder TimeStampToUnixTime auf, ohne doch noch einmal GetTimeStamp aufzurufen?
Könntest Du mir da bitte ein Beispiel für den Aufruf der Prozedur UnixTimeToTimeStamp geben?
var TS: TimeStamp;
UnixTimeToTimeStamp (Zeit_2 div 100, TS); WriteLn (FormatTime (TS, '%s %^/2a %F%n%T'));
("div 100" zur Umrechnung in Sekunden).
Frank
Hallo Liste, hallo Frank,
Du schriebst:
Roland Goretzki schrieb:
Und dann kommt wohl doch FormatTime zum Einsatz, anders als ich in meiner letzten E-Mail vermutete hatte.
Ja, wenn du die Zeit auch ausgeben willst.
Hätte ich auch dann gewollt, wenn es nicht so einfach wäre wie unten beschrieben, da ich fest davon überzeugt bin, daß es sich lohnt, diese Flexibilität nutzen zu können. :-)
[ ... ] Wenn ich eingebe "FormatTime (SystemDatum, %m)", dann erzählt er mir was von "invalid character".
Ach so, das %m muss in '' stehen. Es ist ein ganz normaler Pascal-String. (Natürlich kann man statt einer Konstante auch eine String-Variable verwenden.)
Jetzt, wo Du das sagst, denke ich, daß ich da auch selbst hätte drauf kommen können. Aber selbstverständlich war das für mich nicht, und ich hätte es wohl auch nicht so schnell herausgefunden.
Dazu müßte ich aber zunächst erst einmal überhaupt EIN EINZIGES funktionierendes Beispiel haben.
Ich denke, es lag nur an den Anführungszeichen.
So ist es. Nun ist es ein Gefühl wie Weihnachten. :-)
Ansonsten unten ein etwas;-) komplizierteres Beispiel (mit dem ich mir in meinem Editor die Zeit anzeigen lasse).
Das Beispiel ist nun leicht zu verstehen. Aber wie das mit dem Editor funktioniert, würde mich auch interessieren. Geht das z.B. auch im vim?
Jedenfalls habe ich jetzt meine gewünschte Uhr mit mehr Bewegungsfreiheit als erwartet, und dabei habe ich auch noch eine Menge gelernt. Herzlichen Dank!
Fröhliche Grüße Roland
Roland Goretzki schrieb:
Ansonsten unten ein etwas;-) komplizierteres Beispiel (mit dem ich mir in meinem Editor die Zeit anzeigen lasse).
Das Beispiel ist nun leicht zu verstehen. Aber wie das mit dem Editor funktioniert, würde mich auch interessieren.
Mein Editor (PENG) ist in Pascal geschrieben und verwendet intern auch FormatTime, wobei der Format-String vom Benutzer anpassbar ist.
Geht das z.B. auch im vim?
Mit anderen Editoren kenne ich mich weniger aus, daher weiß ich leider nicht, ob das auch mit vim geht oder wie(*) das mit Emacs geht.
(*) Mit Emacs geht ja bekanntlich alles (im Zweifelsfall schreibe man sich halt ein kleines Betriebssystem in Lisp), daher nur die Frage wie. ;-)
Frank
Hallo Liste, hallo Frank,
ich schrieb:
ich möchte in ein Programm eine Stoppuhr einbauen, möglichst auch mit Sekundenbruchteilen. [...] Das Programm läuft bereits im Netz unter http://www.roland-goretzki.de/cgi-bin/notenhoeren.cgi
Inzwischen habe ich in einem Versuchsprogramm eine Uhr auf Sekundenbasis eingebaut, die auch bisher einwandfrei funktioniert. [ ... ] Nun ist sie entsprechend meinen Fähigkeiten sauberer programmiert. Zur evtl. Begutachtung hänge ich sie an diese E-Mail an.
Gemessen an dem, was folgt, war das noch ein rechter Trümmer. ;-)
GPC hat (in der Unit GPC) die Funktion: function GetMicroSecondTime: MicroSecondTimeType;
Das war wirklich ein heißer Tip für mich!
Vielleicht baue ich damit ja trotzdem noch eine Uhr, mir scheint, daß es damit einfacher gehen könnte.
Soeben geschehen, und: Es war tatsächlich relativ leicht und übersichtlich. :-)
Aber für schnelle Verbindungen und einfache Seiten vielleicht immerhin Zehntelsekunden ...
Mehr hätte ich auch gar nicht gewollt. :-)
Sie zeigt jetzt doch auch Hundertstelsekunden im übersichtlichen Dezimalsystem an und läßt sich, wie sie ist, viel einfacher irgendwo einbauen und möglicherweise anpassen.
Der erwähnte Nachteil mit der Dauer von nur 24 Stunden hat sich hiermit auch erledigt.
Ich hänge sie noch mal an, weil sie mir wirklich sehr übersichtlich scheint und ich mir sicher bin, daß ein fachkundiges Auge mit einem flüchtigen Blick einen Kapitalfehler, falls vorhanden, in (Mikro-) Sekundenschnelle entdecken würde. ;-)
Noch mal herzlichen Dank und Fröhliche Grüße Roland