AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Andere instanz beenden

Ein Thema von MyRealName · begonnen am 4. Okt 2018 · letzter Beitrag vom 5. Okt 2018
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von MyRealName
MyRealName

Registriert seit: 19. Okt 2003
Ort: Heilbronn
679 Beiträge
 
Delphi 10.4 Sydney
 
#1

Andere instanz beenden

  Alt 4. Okt 2018, 22:47
Also nehmen wir mal an, dass mein Programm nicht nachvollziehbar auf einem Rechner beim Beenden immer mal gern im Speicher "hängenbleibt", aber unsichtbar (man sieht es nur im Task Manager). Leider ist da dann auch UniDAC der Meinung, Firebird noch nichts zu sagen, dass wir gehen, die Verbindung also offen bleibt... Das verursacht dann, dass mein Programm annimmt, dass das andere Programm noch da ist. Wenn dann zum Bsp ein Dokument gelockt ist, dann wird das nicht freigegeben, da die Verbindung des locks noch da ist.

Gibt es da eine Möglichkeit, wie beim Task Manager, diese Programm-Instanz von Delphi aus zu schliessen ? Einfach ein WM_CLOSE dürfte nicht gehen, weil scheinbar kann das Programm auf diesen PC nicht einfach runterfahren und ein WM_CLOSE macht ja genau das. Ich kann es auch nicht nachvollziehen, warum und wann es hängenbleibt, es ist sporadisch und bisher nur euf einem Rechner zu beobachten.

Danke schonmal
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

AW: Andere instanz beenden

  Alt 4. Okt 2018, 23:26
Du solltest die Ursache finden und nicht an den Symptomen rumdoktern. da du aber nicht näher schreibst, was dein Programm macht, ist es schwierig dir zu helfen.

Beendest du in WM_CLOSE auch alle laufenden Threads? Das könnte ein Grund sein.

Schließt du die offenen Datenbankverbindungen korrekt?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Andere instanz beenden

  Alt 4. Okt 2018, 23:37
Auf den Thread Titel bezogen, füge TerminateOtherInstances; dem OnFormCreate zu.
Delphi-Quellcode:
procedure TForm1.TerminateOtherInstances;
var
  szClass : pchar;
  sTitle : string;
  h : THandle;

begin
  sTitle := Application.Title;
  GetMem(szClass, 256);
  GetClassName(Application.Handle, szClass, 255);
  Application.Title := 'Dummy Caption';

  h := FindWindow(szClass, pchar(sTitle));
  while h <> 0 do
  begin
    PostMessage(h, WM_QUIT, 0, 0);
    Application.ProcessMessages;
    h := FindWindow(nil, pchar(sTitle));
  end;

  Application.Title := sTitle;
  FreeMem(szClass, 256);
end;
edit
Hinweis: Das funktioniert nur für Applikationen die immer den gleichen Application.Title besitzen!
Gruß vom KodeZwerg

Geändert von KodeZwerg ( 4. Okt 2018 um 23:46 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#4

AW: Andere instanz beenden

  Alt 4. Okt 2018, 23:58
Öhm. Also das ist doch Murks. Ein zweites Programm zu schreiben, weil sich das erste nicht richtig beendet.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Andere instanz beenden

  Alt 5. Okt 2018, 00:30
Ich Verstehe Dich da gerade nicht.
Was ich meinte war, in der Applikation wo man sicherstellen möchte das seine App nur einmal, undzwar frisch, geladen ist, da in FormCreate die "TerminateOtherInstances" Anweisung rein, fertig.
Ab nun sollte es nurnoch einmal diese Applikation geben.
Oder eine Mutex Abfrage, oder oder oder, gibt ja viele Möglichkeiten so was zu realisieren, ich zeigte halt eine davon, wenn die falsch war tuts mir leid.
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Benutzerbild von MyRealName
MyRealName

Registriert seit: 19. Okt 2003
Ort: Heilbronn
679 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: Andere instanz beenden

  Alt 5. Okt 2018, 00:51
Kein 2. Programm, sondern das erste soll prüfen, ob eine instanz hängen geblieben ist.
Ist natürlich keine schöne Lösung, aber ich kann das halt nicht nachvollziehen, mein log ist da schon aus und es passiert nur auf einem Kundenrechner, der 1000km weg ist
  Mit Zitat antworten Zitat
Benutzerbild von MyRealName
MyRealName

Registriert seit: 19. Okt 2003
Ort: Heilbronn
679 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: Andere instanz beenden

  Alt 5. Okt 2018, 00:55
Ich Verstehe Dich da gerade nicht.
Was ich meinte war, in der Applikation wo man sicherstellen möchte das seine App nur einmal, undzwar frisch, geladen ist, da in FormCreate die "TerminateOtherInstances" Anweisung rein, fertig.
Ab nun sollte es nurnoch einmal diese Applikation geben.
Oder eine Mutex Abfrage, oder oder oder, gibt ja viele Möglichkeiten so was zu realisieren, ich zeigte halt eine davon, wenn die falsch war tuts mir leid.


Ist schon richtig, es sollte eine "TerminateOtherInstances" Anweisung werden, den Mutex habe ich schon, weil es ein "Point Of Sale" ist und es keinen Sinn macht, den mehrmals am Laufen zu haben. Da der auch autonom ist, also wenn man Netzwerk oder internet ausfällt, das POS einfach weiterarbeitet und Rechnungen dann synchronisiert, wenn das Netz wieder da ist, lässt man das auch nicht in einem Terminal Server laufen
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.508 Beiträge
 
Delphi 7 Professional
 
#8

AW: Andere instanz beenden

  Alt 5. Okt 2018, 10:50
Delphi-Quellcode:
procedure TForm1.TerminateOtherInstances;
var
  szClass : pchar;
  sTitle : string;
  h : THandle;

begin
  sTitle := Application.Title;
  GetMem(szClass, 256);
  GetClassName(Application.Handle, szClass, 255);
  Application.Title := 'Dummy Caption';

  h := FindWindow(szClass, pchar(sTitle));
  while h <> 0 do
  begin
    PostMessage(h, WM_QUIT, 0, 0);
    Application.ProcessMessages;
    h := FindWindow(nil, pchar(sTitle));
  end;

  Application.Title := sTitle;
  FreeMem(szClass, 256);
end;
Das hat aber einen Haken: Wenn das zu beendende Programm nicht (mehr) auf WM_QUIT reagiert, bleibt auch jede weitere Instanz "hängen". Eventuell in der Schleife mitzählen und nach X Versuchen raus aus der Schleife, mit 'ner entsprechenden Fehlermeldung.

Und ggfls. in der Schleife eine Pause einfügen, damit die andere Instanz Zeit zum Beenden bekommt.

Eventuell ungefähr sowas?
Delphi-Quellcode:
function TForm1.TerminateOtherInstances(iVersuche : Integer; sMeldung : String) : Boolean;
var
  szClass : pchar;
  sTitle : string;
  h : THandle;
  iCount : Integer;
begin
  sTitle := Application.Title;
  iCount := 0;
  GetMem(szClass, 256);
  GetClassName(Application.Handle, szClass, 255);
  Application.Title := 'Dummy Caption';

  h := FindWindow(szClass, pchar(sTitle));
  Result := h = 0;
  while not Result and (iCount < iVersuche) do
  begin
    PostMessage(h, WM_QUIT, 0, 0);
    Application.ProcessMessages;
    iCount := iCount + 1;
    Sleep(1000);
    h := FindWindow(nil, pchar(sTitle));
    Result := h = 0;
  end;
  if iCount >= iVersuche then begin
    MessageDLG(sMeldung,mtError,[mbOk],0);
  end;
  Application.Title := sTitle;
  FreeMem(szClass, 256);
end;
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
2.175 Beiträge
 
#9

AW: Andere instanz beenden

  Alt 5. Okt 2018, 10:51
Zitat:
Kein 2. Programm, sondern das erste soll prüfen, ob eine instanz hängen geblieben ist.
Das würde ich direkt in die DPR schreiben damit die Prüfung stattfindet noch bevor irgendein Formular erzeugt werden konnte (Ressourcensparender und so ...).
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: Andere instanz beenden

  Alt 5. Okt 2018, 11:19
Da er Mutex bereits einsetzt und ich DieDolly Recht gebe (so mach ichs auch hin und wieder) frage ich mich was beim TE damit nicht funktioniert, Handle zum präProzess sollte man ja Dank Mutex ausgewerten haben.

Danke Delphi.Narium, ich werde meine CodeLib anpassen, das hilft!

edit
habe code entfernt der das neu gestartete auch mit abschießt, sorry
Gruß vom KodeZwerg

Geändert von KodeZwerg ( 5. Okt 2018 um 11:38 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 04:01 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