Frage

Ich mache eine Delphi -Anwendung, die im Hintergrund rund um die Uhr auf meinem PC ausgeführt wird, und prüft, ob er einige Aktionen ausführen muss, 30 Minuten warten und erneut überprüfen müssen und so weiter.

Wie kann ich sicherstellen, dass die Anwendung CPU oder Speicher nicht überlastet, weil er ständig ausgeführt wird?

War es hilfreich?

Lösung

Die meisten Programmiersprachen haben eine "Schlaf" -Funktion, die Sie anrufen können, um das Programm zu stoppen.

Sie haben die Kontrolle über den Speicherverbrauch; Sie können Ihr Gedächtnis bearbeiten, bevor Sie schlafen gehen und es neu zuordnen, wenn Sie wach kommen, aber ...

Es könnte besser sein, nur einen wiederkehrenden Job einzurichten. Ich weiß nicht, wie ich das machen soll, aber ich vermute, dass es mit Windows Scripting -Host einen Weg gibt, Ihre Anwendung nach dem gewünschten Zeitplan zu starten.

Andere Tipps

Ein ... kreieren Timer Alle 30 Minuten laufen und rufen Sie Ihre Schecks/Aktionen von dort an. Dann kann Ihre Bewerbung einfach im Leerlauf sitzen, wenn nichts zu tun ist.

Alternativ können Sie eine geplante Aufgabe erstellen, die regelmäßig dazu ausgeführt wird, um dies zu tun.

Die Antworten auf Timer sind gute Lösungen, und ich füge dies hinzu: Stellen Sie sicher, dass das Timer -Ereignis oder die nachfolgende Prozedur aufgerufen werden, um besetzt zu werden. Wenn Sie aufwachen, stellen Sie sicher, dass die letzte Stapel vor dem Start einer neuen Stapel abgeschlossen ist. Dies ist leicht zu übersehen, wenn die Dinge gut fließen, und dann haben Sie eine Situation, in der die Dinge gesichert sind und das gesamte System um 8 Uhr morgens um 8 Uhr log , Prozesse usw.).

Schreiben Sie also Ihr Timer -Ereignis 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;

Die Antworten auf Timer sind so ziemlich genau das, wonach Sie suchen. Schauen Sie sich Ihr Programm im Task -Manager an. Wenn es nichts tut, sollte es in einem "stationären Zustand" des Gedächtnisses sitzen, nicht mehr zuweisen und 1% oder weniger der CPU -Zeit verwenden.

Es ist sicher, die meisten Programme für lange Zeiträume im Leerlauf zu lassen. Die VCL weiß, wie man mit dem Leerlauf umgeht, ohne die CPU -Ressourcen für Sie zu entfernen, und Sie müssen nur einen Timer verwenden, um sicherzustellen, dass sie aufwacht und das Ereignis zum richtigen Zeitpunkt aktiviert.

Wenn Sie einen absoluten Inaktivitätszustand durchsetzen möchten, können Sie die Funktion "Schlaf" verwenden. Ich bin mir jedoch nicht sicher, wie es sich bei einem Neustart verhalten würde. (Ich denke, Windows würde die Anwendung als nicht mehr reagieren.)

Wenn die Anwendung keine Hauptform hat und nur im Tablett sitzt (oder völlig unsichtbar ist), wird sie nicht viel tun. Die Hauptnachrichtenschleife verarbeitet die gesamte Nachricht, die sie vom Betriebssystem erhalten, aber es sollte nicht viele empfangen. Und die wenige Nachricht, die sie erhalten, sollte sie verarbeiten (Herunterfahren, Systemparameter ändern die Benachrichtigung usw.)

Ich denke, Sie könnten einfach einen Timer einrichten und vergessen, Code einzustellen, um Ihr Programm zu zwingen, untätig zu bleiben.

Wenn Sie diese Prozessaktivität wirklich auf ein Maximum einschränken möchten, können Sie die Priorität der Thread festlegen, wenn Sie das Ereignis des Timers eingeben/verlassen. Sie würden also die Priorität auf "normal" festlegen, wenn Sie das Ereignis eingeben, und es auf "niedrig" einstellen, wenn Sie herauskommen.

Sie haben es nicht erzählt, aber wenn Ihre Anwendung mehr als einen Thread verwendet, könnte dies die CPU-Menge hinzufügen, die das Betriebssystem für Ihren Vorgang ausgibt (zeitlich nach Time Slices und Threads-Schalter lesen).

Das Betriebssystem kann auch einige Ihrer Speicherseiten austauschen, wodurch weniger Speicher verwendet wird und/oder die Reduzierung von Speicherausfällen auch in der "Wartezeit" hilft.

Wenn Sie also nur einen Thread verwenden und auch keine zusätzlichen Nachrichtenschleifen haben, kann es ein guter Weg sein, nur den Schlaf () anzurufen, da dies dem Betriebssystem signalisiert, dass Sie für eine lange Zeit überhaupt keine Zeitscheibe benötigen Kommen Sie.

Vermeiden Sie RenditeThread ()/SwitchTotHhread () und Ihre eigene Zeitsperrung (zum Beispiel mit Now (), da dies bedeuten würde, dass viel Thread-Switching stattfindet, um ... nichts zu tun!

Eine andere Methode könnte verwendet werden WaitFormultipleToBjects Mit einer großen Auszeit kann Ihre Anwendung weiterhin auf Nachrichten antworten.

Ich würde empfehlen, eine Serviceanwendung zu erstellen (Starttyp als automatisch festlegen) und CreateTimerqueuetimer als Timer verwenden. Speicherlecks können durch Reservieren von Speicheranforderungen/Poolingklassen gemindert werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top