Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Sich selbst neu starten? (https://www.delphipraxis.net/67701-sich-selbst-neu-starten.html)

Jasocul 19. Apr 2006 07:57

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.

PeterPanino 19. Apr 2006 08:37

Re: Sich selbst neu starten?
 
Zitat:

Zitat von Nicodius
Morgen
jetzt erklär mir nochmal wieso du das brauchst ;)
grüße Nico

Das ist etwas kompliziert zu erklären, ist aber DEFINITIV nichts Illegales.

mbamler 19. Apr 2006 08:44

Re: Sich selbst neu starten?
 
Zitat:

Zitat von PeterPanino
Zitat:

Zitat von Nicodius
Morgen
jetzt erklär mir nochmal wieso du das brauchst ;)
grüße Nico

Das ist etwas kompliziert zu erklären, ist aber DEFINITIV nichts Illegales.


Mach doch einfach sowas wie:

...
Shellexecute('Programmname.exe', true); //mit warten bis das Programm läuft
Terminate; //diese Instanz beenden
...

Gruß
Matthias

r2c2 19. Apr 2006 08:54

Re: Sich selbst neu starten?
 
Oder du schreibtst ne 2-Zeilen-Batch...

mfg

Christian

marabu 19. Apr 2006 10:26

Re: Sich selbst neu starten?
 
Eine Zeile mehr und man hat auch eine Ausstiegsmöglichkeit:

Code:
@echo off
rem this is demo.cmd
demo.exe
if %errorlevel% GTR 0 exit
demo.cmd
Ü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...

Grüße vom marabu

H4ndy 19. Apr 2006 10:38

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)

PeterPanino 20. Apr 2006 00:29

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?

marabu 20. Apr 2006 07:56

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 (Hier im Forum suchenCreateMutex) und tritt dann entweder in die Phase der Ressourcenbeschaffung ein oder beendet sich, mitunter nach Übergabe der Aufrufparameter an die existierende Instanz. Wichtig ist nur, dass du den Ein- und Austritt in bzw. aus dem kritischen Teil deines Programmes korrekt signalisierst. Eine überlappende Ausführung außerhalb dieses Blockes ist kein Problem.

Grüße vom marabu

Aike 27. Jul 2006 10:47

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.

dataspider 27. Jul 2006 11:05

Re: Sich selbst neu starten?
 
Hi,

ich benutze folgende Routine, um z.B. nach kritischen Fehlern mein Programm wieder zu starten.

Delphi-Quellcode:
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;
Frank


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:07 Uhr.
Seite 2 von 3     12 3      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz