Hi,
ich habe folgendes Problem. Wie kann ich in Pascal eine Programmpause von z.B. 20 Sekunden programmieren. Der Befehl „delay“ ist mir bekannt, aber der funktioniert ja je nach Prozessorgeschwindigkewit immer unterschiedlich.
MfG neRo
Hi,
ich habe folgendes Problem. Wie kann ich in Pascal eine Programmpause von z.B. 20 Sekunden programmieren. Der Befehl „delay“ ist mir bekannt, aber der funktioniert ja je nach Prozessorgeschwindigkewit immer unterschiedlich.
MfG neRo
Der Befehl
„delay“ ist mir bekannt, aber der
funktioniert ja je nach
Prozessorgeschwindigkewit immer
unterschiedlich.
Soweit mir bekannt ist, verzögert „Delay(x)“ um x Millisekunden. Inwiefern soll Deiner Meinung nach da was von der Prozessorgeschwindigkeit abhängen?
Gruß
Martin
Soweit mir bekannt ist, verzögert
„Delay(x)“ um x Millisekunden. Inwiefern
soll Deiner Meinung nach da was von der
Prozessorgeschwindigkeit abhängen?
Gruß
Martin
Du hast recht. Bei Delay(x) wird das Programm um x Milisekunden angehalten. Leider haben die „Erschaffer“ von TP nicht damit gerechnet, dass sich die Leistung der Prozessoren so sehr vergrößert, denn Delay(x) heißt für den Prozessor er soll x Rechenschritte ausführen. Bei 33 Mhz entspricht das dann eben auch Milisekunden.
Aber ein Pentium III 500 ist „etwas“ schneller damit fertig. Ich habe es selbst ausprobiert. Auf einem 66Mhz programmiertes Programm lief auf einem 500 in einem Bruchteil der Zeit ab.
Trotzdem Danke!
Wer kann mir noch weiterhelfen???
MfG neRo
hi,
ist zwar alles nicht so genau, aber
wenn es nur um sekunden geht, frage doch
einfach ständig die uhrzeit ab.
bei jeder veränderung der sekunden,
zählst du eine variable um eins hoch.
wenn der gewünschte wert erreicht ist, kann
das programm fortfahren.
wenn du es geschickt anstellst, würde ich
dir empfehlen die uhrzeit mit hilfe einer
ISR (Interrupt Service Routine) abzufragen.
(procedure blabla; interrupt; …)
alles klar?
cu, dennis
[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]
Du müßtest einen Timer programmieren, wie genau das funktioniert ist mir leider nach langer Zeit des nicht programmierens entfallen.
Schau mal auf dem Heise-Server nach. Das gibt´s einen Pascal-Patch der diese Probleme beseitigt.
(ich arbeite nicht mit pascal, aber wer lesen kann ist klar im vorteil)
cu, holli
Hi!
Leider haben die „Erschaffer“ von TP
nicht damit gerechnet, dass sich die
Leistung der Prozessoren so sehr
vergrößert,
denn Delay(x) heißt für den
Prozessor er soll x Rechenschritte
ausführen. Bei 33 Mhz entspricht das dann
eben auch Milisekunden.
NEIN!!! Nenn mir mal die Dokumentation, wo das steht … Also, Delay funktioniert so: Der Prozessor muß n*x Rechenschritte abarbeiten, wobei n gerade die Anzahl von Rechenschritten ist, die er für *eine* Millisekunde benötigt. Wie groß n ist, wird bei jedem Start jedes Programms, das die CRT-Unit verwendet, neu bestimmt. Deshalb verzögert Delay(x) auf JEDEM Rechner um x Millisekunden, egal wie schnell er ist (n ist auf einem 386er mit 20 MHz halt gleich 610, auf einem PentiumIII 550 aber gleich 23800 (sind nur Beispielwerte
, wovon Du allerdings gar nichts merkst).
Ich habe es
selbst ausprobiert. Auf einem 66Mhz
programmiertes Programm lief auf einem
500 in einem Bruchteil der Zeit ab.
Dann ist entweder mit Deinem Programm oder mit Deiner CRT-Unit was faul. Beachte, daß die Original-Unit von Borland buggy ist -> Ersetzen. Zu diesem Punkt siehe
http://www.brain.uni-freiburg.de/~klaus/p…
Gruß
Martin
Hier ist der Patch!
Hi,
das Problem liegt (laut ct, die haben meistens recht .-) in der crt-unit.
Unter http://www.heise.de/ct/software/ctsi liegt der Patch. (Info aus dem vorherigen Heft.)
cu, holli
hi,
ist zwar alles nicht so genau, aber
wenn es nur um sekunden geht, frage doch
einfach ständig die uhrzeit ab.
bei jeder veränderung der sekunden,
zählst du eine variable um eins hoch.
wenn der gewünschte wert erreicht ist,
kann
das programm fortfahren.
Das bringt im allgemeinen für niedrige Intervalle keine befriedigende Lösung. Wenn ich auf diese Weise eine Verzögerung von 1 sec. einbauen will liegt die wahre Verzögerung (je nachdem, wann ich zu warten beginne) zwischen 0,001 und 1,999 sec. Bei Werten um 1 min ist dieser „Fehler“ natürlich meist nicht mehr relevant.
Um zum ursprünglichen Problem zu kommen: Hab´ mich kurz schlau gemacht - ein Patch sollte dieses Problem lösen, die Adresse hat weiter oben schon wer anderer vor mir gefunden…
Hi neRo,
Hier eine Multitaskingfähige Version von Delay
Procedure Delay(i:Word);
//-------------------------------------------------------
Var t,null:LongWord;
Begin
null:=GetTickCount;
Repeat
Application.ProcessMessages;
t:=GetTickCount;
Until t-null>i;
End;
evtl. kanns Schwierigkeiten geben, wenn GetTickCount wieder von 0 zu zählen beginnt (ca. 50 Tage nach booten)
Servus
Manfred
[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]