![]() |
Re: Sich selbst neu starten?
Ganz unwichtig ist die Frage nicht. Auch Viren, Trojaner, etc. sorgen oft dafür, dass sie beim Beenden automatisch neu gestartet werden.
Üblicherweise läuft dafür ein zweites Programm (oder ein Dienst) im Hintergrund mit, das überwacht, ob das Programm noch läuft. |
Re: Sich selbst neu starten?
Zitat:
|
Re: Sich selbst neu starten?
Zitat:
Mach doch einfach sowas wie: ... Shellexecute('Programmname.exe', true); //mit warten bis das Programm läuft Terminate; //diese Instanz beenden ... Gruß Matthias |
Re: Sich selbst neu starten?
Oder du schreibtst ne 2-Zeilen-Batch...
mfg Christian |
Re: Sich selbst neu starten?
Eine Zeile mehr und man hat auch eine Ausstiegsmöglichkeit:
Code:
Übrigens ein Trick aus der Zeit, als man noch nicht wusste, was ein Watchdog Service ist bzw. wie man ihn implementieren könnte. Das letzte mal habe ich das unter MS-DOS 2.10 bei Magee AutoMenu gesehen...
@echo off
rem this is demo.cmd demo.exe if %errorlevel% GTR 0 exit demo.cmd Grüße vom marabu |
Re: Sich selbst neu starten?
Also ich habe mir für dieses "Feature" einfach ein kleines Kommandozeilen-Programm geschrieben,
welches wartet bis mein Hauptprogramm beendet wurde und es dann neustartet. Ist leicht umzusetzten, klein (44KB), resourcenschonend und sieht professioneller aus als ne Batch-Datei ;) (Außerdem denke ich, dass das die "sauberste" Methode, da so dem Hauptprogramm genug Zeit eingeräumt wird, damit es sich selbst sauber beenden kann) |
Re: Sich selbst neu starten?
Das wichtigste Ziel der Methode "Sich selbst neu starten" ist, sicherzustellen, dass nicht beide Programme zur gleichen Zeit auf die selben Daten zugreifen können. Deshalb habe ich mir folgende Vorgehensweise ausgedacht (ProgrammA und ProgrammB sind verschiedene Instanzen *desselben* EXE-Programms):
- ProgrammA startet ProgrammB - ProgrammB überprüft in einer Zeitschleife von X Sekunden im OnCreate-Event des Hauptfensters, ob ProgrammA läuft (etwa mittels Prozessliste): - Wenn nein: Zeitschleife abbrechen und normal starten - Wenn ja: Überprüfung in der Zeitschleife weiter ausführen: - Wenn Zeitschleife X Sekunden abgelaufen: Sich selbst beenden. - ProgrammA beendet sich selbst Damit hätte man mehrere Vorteile: - Starten einer zweiten Instanz wird verhindert. - Programm kann sich selbst neu starten. Durch Ausführung der Instanzprüfung am Beginn des ersten Form.OnCreate-Events wird garantiert, dass nicht Programmcode in mehr als einer Instanz zur gleichen Zeit ausgeführt wird. Wie könnte man die Zeitschleife am besten programmieren? |
Re: Sich selbst neu starten?
Hallo Peter,
vergiss die Zeitschleife, das Starten einer zweiten Instanz deines Programms verhinderst du so oder so nicht - warum auch. Verhindern musst du ja nur die gleichzeitige Benutzung bestimmter Ressourcen. Die zweite Instanz wird immer regulär gestartet, prüft dann eine Integritätsbedingung ( ![]() Grüße vom marabu |
Re: Sich selbst neu starten?
Hm, ich hätte auch gerne die Möglichkeit, mein Programm neu zu starten, aber hier ist keine Lösung zu funden. Der Gund des Neustarts: Einstellungen übernehmen.
|
Re: Sich selbst neu starten?
Hi,
ich benutze folgende Routine, um z.B. nach kritischen Fehlern mein Programm wieder zu starten.
Delphi-Quellcode:
Frank
procedure ForceKillApplication(ARestart: boolean = False);
var AStartInfo: TStartupInfo; AProcInfo: TProcessInformation; begin if ARestart then begin GetStartupInfo(AStartInfo); FillChar(AProcInfo, SizeOf(TProcessInformation), #0); CreateProcess(nil, GetCommandLine, nil, nil, False, CREATE_NEW_PROCESS_GROUP + NORMAL_PRIORITY_CLASS, nil, PChar(GetCurrentDir), AStartInfo, AProcInfo); end; TerminateProcess(GetCurrentProcess, 1); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:52 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz