Entwickler-Ecke
Sonstiges (Delphi) - Freezetime-Utility läuft nur zeitweise / Wer weiss Rat ?
Hochhaus - Sa 22.01.11 10:44
Titel: Freezetime-Utility läuft nur zeitweise / Wer weiss Rat ?
Hallo allerseits,
ich habe ein für mich nützliches Utility geschrieben. Es sollte die PC-Zeit einfrieren - für eine bestimmte Zeit. In der Realität läuft das Utility zeitweise / und zeitweise aber nicht: Es friert den PC so ein, dass andere Proggies wie WinWord nicht mehr aufstarten.
Weiss jemand Rat ? Gibt es einen besseren Weg ? Der Source-Code liegt als Zip-Datei bei ...
Gruss,
Hochhaus
jaenicke - Sa 22.01.11 12:00
Naja, du hast da ja eine Endlosschleife drin. Du lässt zwar zwischendurch vorhandene Messages abarbeiten, aber es gibt dennoch keine Pause (mit MsgWaitForMultipleObjects und einer Zeitabfrage z.B.).
Wahrscheinlich ist der Prozessor schlicht ausgelastet... Und wenn du keinen Mehrkernprozessor hast, ist damit alles blockiert.
Hochhaus - Sa 22.01.11 12:58
Moderiert von
Narses: Komplett-Zitat des letzten Beitrags entfernt.
Ich habe aber nur Mehrkernprozessoren. Ausserdem funktioniert das Utility in 80 % der Fälle anstandslos - nur ab und zu taucht das Problem wieder auf ...!
Da habe ich jedoch noch eine Frage: Gibt es eine Sleep und/oder Delay-Funktion so, dass der Prozess 1 msec. ruht ? Wie binde ich die in mein Proggi ein ?
jaenicke - Sa 22.01.11 13:10
Hochhaus hat folgendes geschrieben : |
| Da habe ich jedoch noch eine Frage: Gibt es eine Sleep und/oder Delay-Funktion so, dass der Prozess 1 msec. ruht ? Wie binde ich die in mein Proggi ein ? |
Was hat es für einen Sinn zu versuchen so oft die Zeit zu setzen? So oft, dass auch die Millisekunden gleich bleiben, kannst du die gar nicht neu setzen. Und für sekundengenau reicht auch alle halbe Sekunde.
Da wäre es ja wohl einfacher, wenn du einfach die Funktionen hookst, mit denen Programme die Zeit abfragen können. Dann kannst du einfach selbst bestimmen welche Zeit denen mitgeteilt werden soll.
Hochhaus - Sa 22.01.11 13:18
Moderiert von
Narses: Komplett-Zitat des letzten Beitrags entfernt.
Ich möchte aber, dass alle Datei + Directory-Einträge exakt dieselbe Uhrzeit aufweisen - mindestens auf die 1/10 sec. genau. Dies brauche ich für ein Backup-Projekt.
Gruss, Hochhaus
P.S. Mit 100 msec. Fehler ist es tolerierbar.
jaenicke - Sa 22.01.11 13:28
:rofl:
Wie wäre es, wenn du einfach die Zeit der Dateien und Verzeichnisse setzt? :autsch:
// EDIT:
Mal abgesehen davon ist das für ein Backup ja eigentlich eher hinderlich, aber das musst du ja wissen.
Hochhaus - Sa 22.01.11 14:00
Moderiert von
Narses: Komplett-Zitat des letzten Beitrags entfernt.
Ich weiss, wie man die Zeit der Dateien setzt. Bei den Verzeichnissen ist das aber anders: Keine Ahnung, wie ich das tun soll. Ich bitte um Rat.
Wie ich gemerkt habe, würde eine einfache Sleep-Funktion für den Prozess in meinem Programm ausreichen, um andere Prozesse in dieser Zeit auszuführen. Gibt es in Delphi eine solche Funktion ? Wie ruft man sie auf ?
Gruss,
Hochhaus
(Dies war eine dumme Frage. Ich habe die Sleep-Funktion nicht gefunden, weil sie der Hilfe-Index nicht auflistet)
Hochhaus - Sa 22.01.11 17:36
jaenicke hat folgendes geschrieben : |
Naja, du hast da ja eine Endlosschleife drin. Du lässt zwar zwischendurch vorhandene Messages abarbeiten, aber es gibt dennoch keine Pause (mit MsgWaitForMultipleObjects und einer Zeitabfrage z.B.).
Wahrscheinlich ist der Prozessor schlicht ausgelastet... Und wenn du keinen Mehrkernprozessor hast, ist damit alles blockiert. |
Dies ist in der Tat so - der Prozessor ist ausgelastet. Der Taskmanager zeigt zeitweise 97 - 99 % ...! Die Abhilfe ist einfacher als gedacht: Im Endlosloop drin ein Sleep(10) einbauen, un das Problem ist gelöst.
Und auch die zweite Methode (Datei + Directory-Zeit setzen) dürfte problemlos funktionieren.
Vielen Dank für die prompte Hilfe !
jaenicke - Sa 22.01.11 17:42
Wie ich schon sagte, was die Pause angeht:
jaenicke hat folgendes geschrieben : |
| Pause (mit MsgWaitForMultipleObjects und einer Zeitabfrage z.B.). |
Nämlich so:
[url]
http://www.delphipraxis.net/topic7355_delay+revisited.html[/url]
Dann blockierst du nicht unnötig komplett. Das kannst du natürlich auch gleich in deine Schleife einbauen, wie ich es eigentlich meinte.
Besser ist aber natürlich, die Zeiten gleich richtig zu setzen.
Hochhaus - Sa 22.01.11 19:20
Moderiert von
Narses: Komplett-Zitat des letzten Beitrags entfernt.
In der Beilage poste ich das fehlerbereinigte Utility. Vielleicht ist es ja noch für etwas nützlich. Der andere Weg, die Datei + Verzeichniszeit direkt zu setzen, ist vermutlich besser. Aber manchmal sieht man den Wald vor lauter Bäumen nicht mehr ... ...
jaenicke - Sa 22.01.11 19:39
Naja, fast. Deine Schleife ist vollkommen überladen. Zudem vergleichst du mit True, das ist falsch. Also statt:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| Repeat For I := 1 To 15 Do Application.ProcessMessages; Delay(10); If SetLocalTime(TimeStruct) Then Application.ProcessMessages; For I := 1 To 15 Do Application.ProcessMessages; Until (BoolX = True); |
Besser:
Delphi-Quelltext
1: 2: 3: 4:
| repeat Delay(50); SetLocalTime(TimeStruct); until BoolX; |
Delay ruft bei Bedarf selbst Application.ProcessMessages auf. Aber eben nur, wenn überhaupt eine Message zum Abarbeiten da ist. Und genau darauf wartet es auch ansonsten.
Und noch eine Korrektur:
Hochhaus hat folgendes geschrieben : |
| Der andere Weg, die Datei + Verzeichniszeit direkt zu setzen, ist vermutlich besser. |
;-)
Hochhaus - Sa 22.01.11 19:50
Vielen Dank ! Die Schleife ist so viel besser + schlanker . Hier könnte man den Beitrag schliessen.
Moderiert von
Martok: Fullquote entfernt
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!