Autor Beitrag
Hochhaus
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 662
Erhaltene Danke: 8

Windows 7
Delphi XE2
BeitragVerfasst: Sa 22.01.11 10:44 
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
Einloggen, um Attachments anzusehen!
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19339
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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.

Für diesen Beitrag haben gedankt: Hochhaus
Hochhaus Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 662
Erhaltene Danke: 8

Windows 7
Delphi XE2
BeitragVerfasst: Sa 22.01.11 12:58 
Moderiert von user profile iconNarses: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19339
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 22.01.11 13:10 
user profile iconHochhaus hat folgendes geschrieben Zum zitierten Posting springen:
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.

Für diesen Beitrag haben gedankt: Hochhaus
Hochhaus Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 662
Erhaltene Danke: 8

Windows 7
Delphi XE2
BeitragVerfasst: Sa 22.01.11 13:18 
Moderiert von user profile iconNarses: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19339
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 662
Erhaltene Danke: 8

Windows 7
Delphi XE2
BeitragVerfasst: Sa 22.01.11 14:00 
Moderiert von user profile iconNarses: 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)
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19339
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 22.01.11 16:20 
user profile iconHochhaus hat folgendes geschrieben Zum zitierten Posting springen:
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.
Eigentlich genauso. :gruebel:
Du holst dir mit CreateFile ein Handle auf das Verzeichnis und benutzt damit dann SetFileTime um die Zeit zu setzen. In der Doku steht ja auch explizit, dass das mit Dateien und Verzeichnissen gleichermaßen geht.

Für diesen Beitrag haben gedankt: Hochhaus
Hochhaus Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 662
Erhaltene Danke: 8

Windows 7
Delphi XE2
BeitragVerfasst: Sa 22.01.11 17:36 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19339
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 22.01.11 17:42 
Wie ich schon sagte, was die Pause angeht:
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Pause (mit MsgWaitForMultipleObjects und einer Zeitabfrage z.B.).

Nämlich so:
[url]www.delphipraxis.net...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.

Für diesen Beitrag haben gedankt: Hochhaus
Hochhaus Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 662
Erhaltene Danke: 8

Windows 7
Delphi XE2
BeitragVerfasst: Sa 22.01.11 19:20 
Moderiert von user profile iconNarses: 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 ... ...
Einloggen, um Attachments anzusehen!
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19339
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 22.01.11 19:39 
Naja, fast. Deine Schleife ist vollkommen überladen. Zudem vergleichst du mit True, das ist falsch. Also statt:
ausblenden 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:
ausblenden 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:
user profile iconHochhaus hat folgendes geschrieben Zum zitierten Posting springen:
Der andere Weg, die Datei + Verzeichniszeit direkt zu setzen, ist vermutlich besser.
;-)

Für diesen Beitrag haben gedankt: Hochhaus
Hochhaus Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 662
Erhaltene Danke: 8

Windows 7
Delphi XE2
BeitragVerfasst: Sa 22.01.11 19:50 
Vielen Dank ! Die Schleife ist so viel besser + schlanker . Hier könnte man den Beitrag schliessen.

Moderiert von user profile iconMartok: Fullquote entfernt