AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Application.Terminate und initialization
Thema durchsuchen
Ansicht
Themen-Optionen

Application.Terminate und initialization

Ein Thema von messie · begonnen am 3. Feb 2009 · letzter Beitrag vom 3. Feb 2009
Antwort Antwort
messie

Registriert seit: 2. Mär 2005
Ort: Göttingen
1.592 Beiträge
 
Delphi 2009 Professional
 
#1

Application.Terminate und initialization

  Alt 3. Feb 2009, 09:21
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.142 Beiträge
 
Delphi 12 Athens
 
#2

Re: Application.Terminate und initialization

  Alt 3. Feb 2009, 09:52
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
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#3

Re: Application.Terminate und initialization

  Alt 3. Feb 2009, 10:02
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.
  Mit Zitat antworten Zitat
messie

Registriert seit: 2. Mär 2005
Ort: Göttingen
1.592 Beiträge
 
Delphi 2009 Professional
 
#4

Re: Application.Terminate und initialization

  Alt 3. Feb 2009, 10:12
Jau, die zweite Variante ist gut (sowohl die zweite von himitsu als auch der zweite Post ). 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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.142 Beiträge
 
Delphi 12 Athens
 
#5

Re: Application.Terminate und initialization

  Alt 3. Feb 2009, 10:23
tschuldschung, dieses böse Copy&Paste ... hMutex müßte hier natürlich ProgHandle heißen.

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"
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
messie

Registriert seit: 2. Mär 2005
Ort: Göttingen
1.592 Beiträge
 
Delphi 2009 Professional
 
#6

Re: Application.Terminate und initialization

  Alt 3. Feb 2009, 10:30
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"
Nee, das ist ja bei OOP anders: ich kann mich ja bei voller Fahrt mit FreeAndNil wieder hinlegen Das was Du beschrieben hast, ist ja ein strukturierter Ablauf...

Grüße, Messie
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:03 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