[Gelöst] Mehrfacher Aufruf einer Anwendung verhindern.
- 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.
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
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
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
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
-
- 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.
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
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)
Windows 10,
- Lazarus 2.2.6 (stable) + fpc 3.2.2 (stable)
- Lazarus 2.2.7 (fixes) + fpc 3.3.1 (main/trunk)
- 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.
Hallo Maik
Danke für Deine Lösung.
Funktioniert wunderbar.
LG
Bibsi
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
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
-
- 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.
Hallo Bibsi,
bitte, hier werden sie geholfen.
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)
Windows 10,
- Lazarus 2.2.6 (stable) + fpc 3.2.2 (stable)
- Lazarus 2.2.7 (fixes) + fpc 3.3.1 (main/trunk)
- 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.
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
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
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
-
- 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.
Hm, was meinst du? Stehe gerade auf dem Schlauch.
Ein paar Infos dazu findest du hier: https://wiki.freepascal.org/UniqueInstance/de
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)
Windows 10,
- Lazarus 2.2.6 (stable) + fpc 3.2.2 (stable)
- Lazarus 2.2.7 (fixes) + fpc 3.3.1 (main/trunk)
- 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.
Ich hab im Demoprogramm die Komponente UniqueInstance1 auf's Form1 gelegt und im Ereignissstvmaster hat geschrieben: ↑Di 28. Feb 2023, 08:34Hm, was meinst du? Stehe gerade auf dem Schlauch.
Code: Alles auswählen
procedure TForm1.UniqueInstance1OtherInstance(Sender: TObject;
ParamCount: Integer; const Parameters: array of String);
begin
Application.BringToFront;
end;
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
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
-
- 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.
Ok, jetzt verstehe ich.
Im englichem Forum habe folgendes gefunden: https://forum.lazarus.freepascal.org/in ... 707.0.html
Hier für die lpr:
In der Main Unit:
Ob das überhaupt zulässig ist und ob das Sicher ist, weiss ich nicht.
Anbei das Vollständiges Beispiel.
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;
...
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;
...
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)
Windows 10,
- Lazarus 2.2.6 (stable) + fpc 3.2.2 (stable)
- Lazarus 2.2.7 (fixes) + fpc 3.3.1 (main/trunk)
- 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.
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?
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
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
- 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.
Man könnte einen Signalhandler installieren der dann in der ersten Instanz aufgerufen wird.
- 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.
Hallo fliegermichl
Und wie macht man das ?
Hast vielleicht ein Beispiel?
LG
Da sprichst Du große Worte gelassen aus.fliegermichl hat geschrieben: ↑Di 28. Feb 2023, 11:19Man könnte einen Signalhandler installieren der dann in der ersten Instanz aufgerufen wird.
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
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
- 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.
Da gibt es hier ein Beispiel: viewtopic.php?f=9&t=14256lcb-User hat geschrieben: ↑Di 28. Feb 2023, 13:22Da sprichst Du große Worte gelassen aus.fliegermichl hat geschrieben: ↑Di 28. Feb 2023, 11:19Man könnte einen Signalhandler installieren der dann in der ersten Instanz aufgerufen wird.
Und wie macht man das ?
Hast vielleicht ein Beispiel?
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de
Re: [Gelöst] Mehrfacher Aufruf einer Anwendung verhindern.
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:
Wie gesagt, nur eine Idee. Habe keine Ahnung, ob dies das Problem des TE zufriedenstellend löst.
Nur für Linux/X11.
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.
Nur für Linux/X11.
- 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.
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
Und noch das angepasste Demo wenns wen interessiert.
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
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