4 Stimmen

Sicherste Weg, um Delphi-Anwendung in den Leerlauf zu warten, für Timer?

Ich mache eine Delphi-Anwendung, die auf meinem PC 24/7 im Hintergrund läuft und prüft, ob es einige Aktionen zu tun hat oder nicht, 30 Minuten warten und wieder prüfen, und so weiter.

Wie kann ich sicherstellen, dass die Anwendung die CPU oder den Speicher nicht überlastet, weil sie ständig läuft?

0 Stimmen

Wie kann man den Speicher freigeben/freigeben?

1 Stimmen

Solange Sie kein Speicherleck haben, brauchen Sie sich um den Speicher keine Sorgen zu machen. Wenn Sie ein Speicherleck haben, beheben Sie es. SysInternals ist hier Ihr Freund.

0 Stimmen

Ihre Anwendung laufen zu lassen ist bereits eine Verschwendung von CPU und Zeit, verwenden Sie den Windows Scheduler, wie der Typ unten vorschlägt!

14voto

Justin Ethier Punkte 126797

Erstellen einer Zeitschaltuhr die alle 30 Minuten ausgeführt werden soll, und rufen Sie Ihre Prüfungen/Aktionen von dort aus auf. Dann kann Ihre Anwendung einfach im Leerlauf arbeiten, wenn es nichts zu tun gibt.

Alternativ können Sie auch einen geplanten Task erstellen, der nur in regelmäßigen Abständen ausgeführt wird.

5voto

Chris Thornton Punkte 15410

Die Antworten zu den Zeitschaltuhren sind gute Lösungen, und ich füge dies hinzu: Vergewissern Sie sich, dass das Timer-Ereignis oder die nachfolgend aufgerufene Prozedur prüft, ob der Benutzer beschäftigt ist, d.h. wenn Sie aufwachen, stellen Sie sicher, dass der letzte Stapel fertig ist, bevor Sie einen neuen Stapel starten. Das kann leicht übersehen werden, wenn die Dinge gut laufen, und dann hat man eine Situation, in der die Dinge gesichert sind und das ganze System um 8 Uhr morgens blockiert ist, weil um Mitternacht etwas Schlimmes passiert ist und sich jetzt 16 Aufrufe (oder Threads, Prozesse usw.) aufgestapelt haben.

Schreiben Sie Ihr Timer-Ereignis also wie folgt:

OnMyTimer...
begin
  MyTimer.Enabled := false;
  try
    DoSomethingForALongTime;  // Usually runs in 45 seconds, but sometimes takes 45 minutes!
  finally
    MyTimer.Enabled := true;  // and (SomeAbortRequest = False) and (SomeHorribleErrorCount = 0);  
  end;
end;

1voto

Mason Wheeler Punkte 79858

Die Antworten zu den Zeitschaltuhren sind so ziemlich genau das, wonach Sie suchen. Zu Ihrer Frage, wie Sie die CPU oder den Speicher nicht überlasten, sehen Sie sich Ihr Programm im Task-Manager an. Wenn es nichts tut, sollte es einen "stabilen Zustand" des Arbeitsspeichers einnehmen, nicht mehr zuweisen und 1 % oder weniger der CPU-Zeit verwenden.

Die meisten Programme können ohne Bedenken für längere Zeit im Leerlauf laufen. Die VCL weiß, wie sie mit dem Leerlauf umzugehen hat, ohne CPU-Ressourcen für Sie zu beanspruchen, und Sie müssen nur einen Timer verwenden, um sicherzustellen, dass sie aufwacht und ihr Ereignis zur richtigen Zeit aktiviert.

0voto

dash-tom-bang Punkte 16755

Die meisten Programmiersprachen haben eine "Sleep"-Funktion, die Sie aufrufen können, damit das Programm aufhört, etwas zu tun.

Sie haben die Kontrolle über die Speichernutzung; Sie können den Speicher vor dem Schlafengehen freigeben und nach dem Aufwachen neu zuweisen, aber...

Es könnte besser sein, einfach einen wiederkehrenden Auftrag einzurichten. Ich weiß nicht, wie man das macht, aber ich vermute, dass es mit dem Windows Scripting Host eine Möglichkeit gibt, Ihre Anwendung nach einem beliebigen Zeitplan zu starten.

0voto

Ken Bourassa Punkte 6167

Wenn Sie einen absoluten Zustand der Inaktivität erzwingen wollen, könnten Sie die Funktion "sleep" verwenden. Allerdings bin ich mir nicht sicher, wie es sich bei einem Neustart verhalten würde. (Ich vermute, Windows würde die Anwendung als nicht ansprechbar melden).

Wenn die Anwendung kein Hauptformular hat und nur in der Taskleiste liegt (oder völlig unsichtbar ist), wird sie nicht viel bewirken. Die Hauptnachrichtenschleife verarbeitet alle Nachrichten, die sie vom Betriebssystem erhält, aber sie sollte nicht viele erhalten. Und die wenigen Nachrichten, die sie erhält, sollte sie verarbeiten (Shutdown-Nachrichten, Benachrichtigung über die Änderung von Systemparametern, usw.)

Ich denke also, dass man einfach einen Timer einrichten und den Code vergessen kann, der das Programm zwingt, im Leerlauf zu bleiben.

Wenn Sie die Prozessaktivität wirklich auf ein Maximum beschränken wollen, können Sie die Thread-Priorität beim Eintritt in das Ereignis des Zeitgebers bzw. beim Verlassen des Ereignisses festlegen. Sie würden also die Priorität auf "normal" setzen, wenn Sie das Ereignis betreten, und sie auf "niedrig" setzen, wenn Sie es verlassen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X