[Gelöst] Mehrfacher Aufruf einer Anwendung verhindern.

Für allgemeine Fragen zur Programmierung, welche nicht! direkt mit Lazarus zu tun haben.
Antworten
Benutzeravatar
lcb-User
Beiträge: 54
Registriert: Di 15. Jul 2014, 13:18
OS, Lazarus, FPC: Linux Mint 21.1 Cinnamon Lazarus 2.3.0 (rev main-2_3-3744-g967034aff5) FPC 3.3.1
CPU-Target: 64Bit
Wohnort: München

[Gelöst] Mehrfacher Aufruf einer Anwendung verhindern.

Beitrag von lcb-User »

Liebe Forengemeinde

Meine Anwendung ist eine Datenbankanwendung(Firebird). Die Verbindung zum Server(Raspberry Pi) beim Programmstart, der im lokalem Netz hängt, benötigt ein paar Takte zum Aufbau der Verbindung.
Darum hab ich ein Splash Screen (Startbildschirm) vorgeschaltet.
Es ist alles bestens, besonders gab's da unter Linux am Anfang Anzeigeprobleme die ich auch geklärt bekommen habe.

Jetzt zu meinem Problem:
Ich hab UniqueInstance auf's Mainform gelegt und es soweit hinbekommen das die Anwendung beim nochmaligen Start die bereits laufende Instanz in den Vordergrund bringt >Application.BringToFront< und sich selbst beendet.

Das Problem: ich bekomme den Zeitpunk der Beendigung der zweiten Instanz nicht vor den Zeitpunkt der Kontaktaufnahme des Servers.
Eigentlich müsste das alles vor der Anzeige des Splash Screen ablaufen.

Ich hoffe das jemand die Zeit und Lust hat meine Demoanwendung zu prüfen und eventuell eine Lösung für mich hat.

Die Demoanwendung verhält sich genau so wie meine eigentliche Datenbankanwendung. Laufende Anwendung minimieren und die Anwendung nochmal starten. Dann wird die erste Instanz nach vorne gebracht und der Splash Screen der zweiten Instanz angezeigt bis der Kontakt zum Server aufgebaut ist(wird in der Demo simuliert) um dann beendet zu werden.

Danke! 😄

Liebe Grüße
Bibsi
Mehrfacher_Aufruf_verhindern.zip
Demo Anwendung
(139.13 KiB) 40-mal heruntergeladen
Zuletzt geändert von lcb-User am Mo 27. Feb 2023, 17:12, insgesamt 1-mal geändert.
Sonnige Grüße
Bibsi


Traue keiner Statistik die du nicht selbst gefälscht hast (Sir Winston Churchill 1874 - 1965)
Linux Mint 21.1 Cinnamon 5.6.7 Kernel 5.19.0-35-generic
Lazarus 2.3.0 (rev main-2_3-3744-g967034aff5) FPC 3.3.1 x86_64-linux-gtk2

sstvmaster
Beiträge: 575
Registriert: Sa 22. Okt 2016, 23:12
OS, Lazarus, FPC: W10, L 2.2.6
CPU-Target: 32+64bit
Wohnort: Dresden

Re: Mehrfacher Aufruf einer Anwendung verhindern.

Beitrag von sstvmaster »

Hier mein Lösungsvorschlag:

In der Mainunit die UniqueInstance entfernen und in der lpr die unit UniqueInstanceRaw nach Forms aufnehmen.
Weiter siehe Beispiel im Anhang.

LG Maik
Dateianhänge
demoproject_sstvmaster.zip
(141.26 KiB) 52-mal heruntergeladen
LG Maik

Windows 10,
- Lazarus 2.2.6 (stable) + fpc 3.2.2 (stable)
- Lazarus 2.2.7 (fixes) + fpc 3.3.1 (main/trunk)

Benutzeravatar
lcb-User
Beiträge: 54
Registriert: Di 15. Jul 2014, 13:18
OS, Lazarus, FPC: Linux Mint 21.1 Cinnamon Lazarus 2.3.0 (rev main-2_3-3744-g967034aff5) FPC 3.3.1
CPU-Target: 64Bit
Wohnort: München

Re: Mehrfacher Aufruf einer Anwendung verhindern.

Beitrag von lcb-User »

Hallo Maik

Danke für Deine Lösung.
Funktioniert wunderbar. :)

LG
Bibsi
Sonnige Grüße
Bibsi


Traue keiner Statistik die du nicht selbst gefälscht hast (Sir Winston Churchill 1874 - 1965)
Linux Mint 21.1 Cinnamon 5.6.7 Kernel 5.19.0-35-generic
Lazarus 2.3.0 (rev main-2_3-3744-g967034aff5) FPC 3.3.1 x86_64-linux-gtk2

sstvmaster
Beiträge: 575
Registriert: Sa 22. Okt 2016, 23:12
OS, Lazarus, FPC: W10, L 2.2.6
CPU-Target: 32+64bit
Wohnort: Dresden

Re: [Gelöst] Mehrfacher Aufruf einer Anwendung verhindern.

Beitrag von sstvmaster »

Hallo Bibsi,

bitte, hier werden sie geholfen.
LG Maik

Windows 10,
- Lazarus 2.2.6 (stable) + fpc 3.2.2 (stable)
- Lazarus 2.2.7 (fixes) + fpc 3.3.1 (main/trunk)

Benutzeravatar
lcb-User
Beiträge: 54
Registriert: Di 15. Jul 2014, 13:18
OS, Lazarus, FPC: Linux Mint 21.1 Cinnamon Lazarus 2.3.0 (rev main-2_3-3744-g967034aff5) FPC 3.3.1
CPU-Target: 64Bit
Wohnort: München

Re: [Gelöst] Mehrfacher Aufruf einer Anwendung verhindern.

Beitrag von lcb-User »

Eine Frage hab ich dann doch noch:
Wie kann ich der ersten Instanz sagen das es sich zeigen soll?
Ein Ereignis gibts ja nicht. :?

LG
Sonnige Grüße
Bibsi


Traue keiner Statistik die du nicht selbst gefälscht hast (Sir Winston Churchill 1874 - 1965)
Linux Mint 21.1 Cinnamon 5.6.7 Kernel 5.19.0-35-generic
Lazarus 2.3.0 (rev main-2_3-3744-g967034aff5) FPC 3.3.1 x86_64-linux-gtk2

sstvmaster
Beiträge: 575
Registriert: Sa 22. Okt 2016, 23:12
OS, Lazarus, FPC: W10, L 2.2.6
CPU-Target: 32+64bit
Wohnort: Dresden

Re: [Gelöst] Mehrfacher Aufruf einer Anwendung verhindern.

Beitrag von sstvmaster »

Hm, was meinst du? Stehe gerade auf dem Schlauch.

Ein paar Infos dazu findest du hier: https://wiki.freepascal.org/UniqueInstance/de
LG Maik

Windows 10,
- Lazarus 2.2.6 (stable) + fpc 3.2.2 (stable)
- Lazarus 2.2.7 (fixes) + fpc 3.3.1 (main/trunk)

Benutzeravatar
lcb-User
Beiträge: 54
Registriert: Di 15. Jul 2014, 13:18
OS, Lazarus, FPC: Linux Mint 21.1 Cinnamon Lazarus 2.3.0 (rev main-2_3-3744-g967034aff5) FPC 3.3.1
CPU-Target: 64Bit
Wohnort: München

Re: [Gelöst] Mehrfacher Aufruf einer Anwendung verhindern.

Beitrag von lcb-User »

sstvmaster hat geschrieben:
Di 28. Feb 2023, 08:34
Hm, was meinst du? Stehe gerade auf dem Schlauch.
Ich hab im Demoprogramm die Komponente UniqueInstance1 auf's Form1 gelegt und im Ereignis

Code: Alles auswählen

procedure TForm1.UniqueInstance1OtherInstance(Sender: TObject;
  ParamCount: Integer; const Parameters: array of String);
begin
  Application.BringToFront;
end;
definiert.

Nur bei Deinem Konstrukt weiß ich nicht wie ich
in der ersten Instanz mitbekomme das es sich BringToFront bringrn soll.
Sonnige Grüße
Bibsi


Traue keiner Statistik die du nicht selbst gefälscht hast (Sir Winston Churchill 1874 - 1965)
Linux Mint 21.1 Cinnamon 5.6.7 Kernel 5.19.0-35-generic
Lazarus 2.3.0 (rev main-2_3-3744-g967034aff5) FPC 3.3.1 x86_64-linux-gtk2

sstvmaster
Beiträge: 575
Registriert: Sa 22. Okt 2016, 23:12
OS, Lazarus, FPC: W10, L 2.2.6
CPU-Target: 32+64bit
Wohnort: Dresden

Re: [Gelöst] Mehrfacher Aufruf einer Anwendung verhindern.

Beitrag von sstvmaster »

Ok, jetzt verstehe ich.

Im englichem Forum habe folgendes gefunden: https://forum.lazarus.freepascal.org/in ... 707.0.html

Hier für die lpr:

Code: Alles auswählen

...
var
  loEnde, loStart : DWord;
  MyProgIsRunning: boolean; export; // <-- neu 
...
  Application.Initialize;

  // --- neu anfang ---
  MyProgIsRunning := False;
  if InstanceRunning then begin
    Application.MessageBox('Programm läuft bereits!!!', 'Mein Programm', 24);
    halt;
  end;
  MyProgIsRunning := InstanceRunning; // <--
  // --- neu ende ---

  loStart:=GetTickCount64; 
...  
In der Main Unit:

Code: Alles auswählen

...
  { TForm1 }

  TForm1 = class(TForm)
    Panel1: TPanel;
    procedure FormCreate(Sender: TObject);

  private

  public

  end;

var
  Form1: TForm1;
  MyProgIsRunning : boolean; external;  // <--
...
procedure TForm1.FormCreate(Sender: TObject);
begin
  ShowMessage(BoolToStr(MyProgIsRunning, 'True', 'False'));  // Nur zum Prüfen
  if MyProgIsRunning then begin
    Application.BringToFront;
  end;
end;   
...
Ob das überhaupt zulässig ist und ob das Sicher ist, weiss ich nicht.
Anbei das Vollständiges Beispiel.
Dateianhänge
demoproject_sstvmaster2.zip
(141.44 KiB) 40-mal heruntergeladen
LG Maik

Windows 10,
- Lazarus 2.2.6 (stable) + fpc 3.2.2 (stable)
- Lazarus 2.2.7 (fixes) + fpc 3.3.1 (main/trunk)

Benutzeravatar
lcb-User
Beiträge: 54
Registriert: Di 15. Jul 2014, 13:18
OS, Lazarus, FPC: Linux Mint 21.1 Cinnamon Lazarus 2.3.0 (rev main-2_3-3744-g967034aff5) FPC 3.3.1
CPU-Target: 64Bit
Wohnort: München

Re: [Gelöst] Mehrfacher Aufruf einer Anwendung verhindern.

Beitrag von lcb-User »

Hallo Maik
Danke das Du dich damit noch beschäftigst. :)

Nein, das hat nicht funktioniert, zumindest unter Linux.
Die erste Instanz wird nicht BringToFront gebracht.

Mir ist auch nicht klar wie die Kommunikation zwischen den Instanzen funktioniert.

Eigentlich müsste es in etwa so ablaufen:
Start der zweiten Instanz und erkennen das bereits eine Instanz läuft.
Darauf die zweite Instanz sagt:
Hallo Erste Instanz der der vor dem Bildschirm sitzt will dich nochmal aufrufen. Kann es sein dass er dich nicht sieht weil du minimiert bist?
Zeig dich - und tschüss! ;-)

Worauf die Erste Instanz sich wieder zeigt.
Die erste Instanz bräuchte vermutlich einen Timer der von Zeit zu Zeit prüft ob eine Nachricht reinkommt.
Oder?
Sonnige Grüße
Bibsi


Traue keiner Statistik die du nicht selbst gefälscht hast (Sir Winston Churchill 1874 - 1965)
Linux Mint 21.1 Cinnamon 5.6.7 Kernel 5.19.0-35-generic
Lazarus 2.3.0 (rev main-2_3-3744-g967034aff5) FPC 3.3.1 x86_64-linux-gtk2

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1432
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: [Gelöst] Mehrfacher Aufruf einer Anwendung verhindern.

Beitrag von fliegermichl »

Man könnte einen Signalhandler installieren der dann in der ersten Instanz aufgerufen wird.

Benutzeravatar
lcb-User
Beiträge: 54
Registriert: Di 15. Jul 2014, 13:18
OS, Lazarus, FPC: Linux Mint 21.1 Cinnamon Lazarus 2.3.0 (rev main-2_3-3744-g967034aff5) FPC 3.3.1
CPU-Target: 64Bit
Wohnort: München

Re: [Gelöst] Mehrfacher Aufruf einer Anwendung verhindern.

Beitrag von lcb-User »

Hallo fliegermichl
fliegermichl hat geschrieben:
Di 28. Feb 2023, 11:19
Man könnte einen Signalhandler installieren der dann in der ersten Instanz aufgerufen wird.
Da sprichst Du große Worte gelassen aus. :lol:
Und wie macht man das ?
Hast vielleicht ein Beispiel?

LG
Sonnige Grüße
Bibsi


Traue keiner Statistik die du nicht selbst gefälscht hast (Sir Winston Churchill 1874 - 1965)
Linux Mint 21.1 Cinnamon 5.6.7 Kernel 5.19.0-35-generic
Lazarus 2.3.0 (rev main-2_3-3744-g967034aff5) FPC 3.3.1 x86_64-linux-gtk2

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2636
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: [Gelöst] Mehrfacher Aufruf einer Anwendung verhindern.

Beitrag von m.fuchs »

lcb-User hat geschrieben:
Di 28. Feb 2023, 13:22
fliegermichl hat geschrieben:
Di 28. Feb 2023, 11:19
Man könnte einen Signalhandler installieren der dann in der ersten Instanz aufgerufen wird.
Da sprichst Du große Worte gelassen aus. :lol:
Und wie macht man das ?
Hast vielleicht ein Beispiel?
Da gibt es hier ein Beispiel: viewtopic.php?f=9&t=14256
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Benutzeravatar
theo
Beiträge: 10468
Registriert: Mo 11. Sep 2006, 19:01

Re: [Gelöst] Mehrfacher Aufruf einer Anwendung verhindern.

Beitrag von theo »

Ist es nur für Linux?
Dann könnte man evtl. auch einfach mit Xlib arbeiten und schauen, ob es ein solches Window gibt und dieses ggf. hervorholen, ohne dass die andere Instanz speziell reagieren muss.
Nur so eine Idee...

EDIT Hab's mal kurz ausprobiert. Müsste man noch testen, aber es scheint zu klappen.
Das Executable sollte idealerweise einen "unique name" haben, sonst müsste man noch den Exe-Pfad prüfen.
xwindowlist gibt es ja schon länger: https://www.theo.ch/lazarus/winlist2.zip

Z.B. so:

Code: Alles auswählen

program project1;

{$mode objfpc}{$H+}

uses
  {$IFDEF UNIX}
  cthreads,
  {$ENDIF}
  {$IFDEF HASAMIGA}
  athreads,
  {$ENDIF}
  Interfaces, // this includes the LCL widgetset
  Forms,
  sysutils,
  xwindowlist,
  Unit1 { you can add units after this };

{$R *.res}

var
  XL: TXWindowList;
  i: integer;
  PID: cardinal;

begin
  XL := TXWindowList.Create;
  XL.UpdateWindowList;
  for i := 0 to XL.WindowList.Count - 1 do
  begin
    PID := XL.GetWindowPID(XL.WindowList[i]);
    if (PID <> 0) and (ExtractFileName(XL.GetWindowCmd(PID)) = ExtractFileName(Application.ExeName)) then
    begin
      XL.ActivateWindow(XL.WindowList[i]);
      Writeln('Window raised, exiting');
      Exit;
    end;
  end;
  XL.Free;

  RequireDerivedFormResource := True;
  Application.Scaled := True;
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.      
Wie gesagt, nur eine Idee. Habe keine Ahnung, ob dies das Problem des TE zufriedenstellend löst.
Nur für Linux/X11.

Benutzeravatar
lcb-User
Beiträge: 54
Registriert: Di 15. Jul 2014, 13:18
OS, Lazarus, FPC: Linux Mint 21.1 Cinnamon Lazarus 2.3.0 (rev main-2_3-3744-g967034aff5) FPC 3.3.1
CPU-Target: 64Bit
Wohnort: München

Re: [Gelöst] Mehrfacher Aufruf einer Anwendung verhindern.

Beitrag von lcb-User »

theo hat geschrieben:
Di 28. Feb 2023, 14:02
Wie gesagt, nur eine Idee. Habe keine Ahnung, ob dies das Problem des TE zufriedenstellend löst.
Nur für Linux/X11.
Natürlich würde ich schon auch eine Lösung für Window Linux und Mac toll finden.
Aber es ist genau was ich wollte.

Danke Theo hat mir geholfen.
Euch Allen danke für die Beiträge.
LG :D

Und noch das angepasste Demo wenns wen interessiert. :wink:
Mehrfacher_Aufruf_verhindern_v2.zip
(142.64 KiB) 39-mal heruntergeladen
Sonnige Grüße
Bibsi


Traue keiner Statistik die du nicht selbst gefälscht hast (Sir Winston Churchill 1874 - 1965)
Linux Mint 21.1 Cinnamon 5.6.7 Kernel 5.19.0-35-generic
Lazarus 2.3.0 (rev main-2_3-3744-g967034aff5) FPC 3.3.1 x86_64-linux-gtk2

Antworten