Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Application.Terminate und initialization (https://www.delphipraxis.net/128639-application-terminate-und-initialization.html)

messie 3. Feb 2009 09:21


Application.Terminate und initialization
 
Moin,

ich habe in einer Software eine umfangreiche Initialisierung von Hardware. Ich brauche also eine Absicherung gegen einen Mehrfachaufruf des Programms. Die wird in der initialization-Klausel aufgerufen, ebenso wie die Initialisierung der Hardware. Zu Beginn hatte ich das so verwendet:
Delphi-Quellcode:
ProgHandle := CreateMutex(nil, True, 'Anwendung');
  if GetLastError = ERROR_ALREADY_EXISTS then
  begin
    Application.Terminate;
  end;
Im Test schlug das fehl, weil es doch noch Hardwarezugriffe gab.
Ich habe es erstmal gelöst, indem ich das Terminate durch HALT ersetzt habe, würde aber gerne wissen, ob die Initialisierung des Programms auch bei Terminate noch voll durchlaufen wird oder wie das Verhalten tatsächlich ist. Laut Hilfe ruft Terminate postQuitMessage auf. Wenn das aber erst nach Abschluss der Programminitialisierung verarbeitet wird, muss ich das umstrukturieren.

Grüße, Messie

himitsu 3. Feb 2009 09:52

Re: Application.Terminate und initialization
 
wo hast du denn diesen Code in dein Programm eingebaut?

du kannst natürlich auch das Programm garnicht erst starten lassen:
Delphi-Quellcode:
begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  ProgHandle := CreateMutex(nil, True, 'Anwendung');
  if GetLastError <> ERROR_ALREADY_EXISTS then
  begin
    Application.Run;
  end;
  CloseHandle(ProgHandle);
end.

// oder

begin
  ProgHandle := CreateMutex(nil, True, 'Anwendung');
  if GetLastError <> ERROR_ALREADY_EXISTS then
  begin
    Application.Initialize;
    Application.CreateForm(TForm1, Form1);
    Application.Run;
  end;
  CloseHandle(ProgHandle);
end.

// oder ... nja, halt das überspringen, was
// in diesem Fall nicht ausgeführt werden soll

nahpets 3. Feb 2009 10:02

Re: Application.Terminate und initialization
 
Hallo,

habe keine Lösung, aber einen Vorschlag:
Delphi-Quellcode:
begin
  ProgHandle := CreateMutex(nil, True, 'Anwendung');
  if GetLastError <> ERROR_ALREADY_EXISTS then
  begin
    Application.Initialize;
    Application.CreateForm(TfmMain, fmMain);
    Application.CreateForm(TfmLogSort, fmLogSort);
    Application.CreateForm(TfmDatenauswertung, fmDatenauswertung);
    Application.Run;
  end;
  CloseHandle(hMutex);
end.
Du muss (denk ich mal) das Programm beenden, bevor die ersten Initialisierungen aufgerufen werden.

messie 3. Feb 2009 10:12

Re: Application.Terminate und initialization
 
Jau, die zweite Variante ist gut (sowohl die zweite von himitsu als auch der zweite Post :shock: ). Ich gehe mal davon aus, dass hMutex hier nicht von Bedeutung ist.
Ich hatte in der dpr noch nicht mit eigenen Variablen gearbeitet. Aber das gibt mir einige neue Möglichkeiten.

Danke, Messie

himitsu 3. Feb 2009 10:23

Re: Application.Terminate und initialization
 
tschuldschung, dieses böse Copy&Paste ... hMutex müßte hier natürlich ProgHandle heißen. :oops:

Hier im Forum suchenOneInstance, Hier im Forum suchenProgramm nur einmal starten, Hier im Forum suchenmehrere Instanzen verhindern usw.

PS: z.B. erst im FormCreate abbrechen zu wollen wäre so, als wenn du nac 200 km bei voller Fahrt auf der Autobahn in den Rückwärtsgang schaltest und sagst "ach nee, ich fahr heut nicht weg und bleib noch 'nen bissl liegen" :angel2:

messie 3. Feb 2009 10:30

Re: Application.Terminate und initialization
 
Zitat:

Zitat von himitsu
...wäre so, als wenn du nac 200 km bei voller Fahrt auf der Autobahn in den Rückwärtsgang schaltest und sagst "ach nee, ich fahr heut nicht weg und bleib noch 'nen bissl liegen" :angel2:

Nee, das ist ja bei OOP anders: ich kann mich ja bei voller Fahrt mit FreeAndNil wieder hinlegen :lol: Das was Du beschrieben hast, ist ja ein strukturierter Ablauf...

Grüße, Messie


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:13 Uhr.

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