Re-2: Programm nicht 2 Mal starten (REALbasic network user group Deutschland Mailinglist archive)
Back to the thread list
Previous thread: Crash Reporter
Next thread: Methoden-Namen als Parameter übergeben
| Re-2: Programm nicht 2 Mal starten |
| Date: 08.03.10 11:45 (Mon, 8 Mar 2010 10:45:33 +0000) |
| From: MGE Lists |
|
Christian,
zum Beenden des Programms. HastDu eventuell kein "DefaultWindow" in der App eingestellt und irgendwo "App.AutoQuit = True" eingebaut? Zum Mutex: Wie ich es im Beispiel geschrieben hatte, Du musst den Mutex in der App.Klasse als Property / Eigenschaft definieren und nicht im Open.Event. Wenn Du "dim meinMutex as Mutex" im Open.Event definierst, wird der Mutex automatisch von RB geschlossen "leave" wenn "Open.Event" abgearbeitet ist! Du willst ja aber erreichen, das der Mutex so lange existiert, bis das Programm selbst geschlossen wird. Das sollte und macht RB automatisch. Falls nicht, kannst Du im App.Close Event folgenden Code einfügen. // App.Property / Eigenschaft myMutex As Mutex // App.Open Event myMutex = New Mutex( ExecutableFile.Name ) if Not myMutex.TryEnter then // MsgBox( "Eine Instanz des Programm läuft bereits!" ) // Quit end if // App.Close Event if myMutex <> Nil then myMutex.Leave end if Grüße Thomas Nauck -------- Original Message -------- Subject: Re: Programm nicht 2 Mal starten (07-Mrz-2010 17:11) From: Christian Hahn <<email address removed>> To: <email address removed> > Hallo, > > was ist jetzt passiert? > mit folgendem Code in App.Open startet das Programm, msgbox "läuft" kommt > auf und dann beendet sich das Programm. Eine zweite Instanz des Programms > wurde noch gar nicht versucht zu starten. > Aber jetzt! Nach Entfernung des codes, Absuchen des Windows Task-Manager > und > auch Neustart des Rechners schließt sich das Programm immer noch (obwohl > der > Code gar nicht mehr vorhanden ist). > > dim meinMutex as Mutex > meinMutex = New Mutex( "ZensurenEingabe_19_Client.exe" ) > if Not meinMutex.TryEnter then > msgbox "kein zweiter Programmstart" > Quit > else > msgbox "läuft" > end if > > Das ist mir doch noch zu viel Rätselraten, die online-Hilfe und User's > Guide > Informationen reichen noch nicht zu meinem Verständnis. > Bisher verstehe ich: Die classes Semaphore, CriticalSection und Mutex haben > > etwa alle die gleiche Absicht, sie reservieren die Benutzung einer sog. > resource für einen bestimmten anderen process. > Oder muss man sagen, ein process schützt sich vor der Benutzung durch einen > > anderen process mithilfe eines Semaphore? > Davon hängt für mein Verständnis ab, wo die Klasse definiert wird und von > wem die Befehle enter und leave gesetzt werden. > Was alles kann eine resource sein? > Besonders im Falle des Mutex. Was an dem Programm wird geschützt bzw. > welche > resource versucht ein weiterer Progammstart zu benutzen? > > einstweilen beste Grüße, Christian Hahn. > > ----- Original Message ----- > From: "MGE Lists" <<email address removed>> > To: <<email address removed>> > Sent: Saturday, March 06, 2010 6:52 PM > Subject: Re: Programm nicht 2 Mal starten > > > Hallo Christian, > dafür nimmst Du am besten einen Mutex der als > Property in der App.Klasse definiert ist und > versuchst ihn im App.Open Event zu setzen. > Als Property, damit er während der kompletten > Programmlaufzeit erhalten bleibt. > > // > myMutex = New Mutex( "Programmname" ) > if Not myMutex.TryEnter then > // > Quit > end if > > Grüße > Thomas > > -------- Original Message -------- > Subject: Programm nicht 2 Mal starten (06-Mrz-2010 17:10) > From: Christian Hahn <<email address removed>> > To: <email address removed> > > > Hallo, ich glaube mich zu erinnern, dass wir das hier schon 'mal hatten, > > aber ich finde es nicht wieder. > > Wie kann man verhindern, dass ein Programm nicht 2 Mal gestartet wird, > > oder > > genauer, wie kann man feststellen, ob ein Programm schon gestartet wurde? > > beste Grüße, Christian Hahn. > > > > |
| Re: Programm nicht 2 Mal starten |
| Date: 08.03.10 22:00 (Mon, 8 Mar 2010 22:00:26 +0100) |
| From: Christian Hahn |
|
Ja, die fehlende Deklaration als Property war's, da war ich beim Lesen nicht
aufmerksam genug. Und jetzt klappt's auch. Besten Dank. Und dennoch, um die Funktionszusammenhänge wirklich zu verstehen (und um dann auch selbstständig handeln zu können), wünschte ich mir, dass 'mal jemand über all diese tieferliegenden Dinge, die auch im User's Guide nicht mehr erklärt werden, in einer Zusammenschau veröffentlicht. Es muss ja nicht gleich ein Buch sein. Vielleicht tät's auch ein Wiki mit systematischem Inhaltsverzeichnis, vielleicht können dann alle Verständigen, jeder ein Stückchen, daran mitschreiben. Wie ich sehe, komme ich jetzt mit einer ganzen Reihe von Fragen, die eine Etage tiefer in die Funktionsweise von Programmen kurz vor Betriebssystem-Ebene gehen. Da sind z.B.: CriticalSection, Semaphore, Mutex interfaces, Shell, API Dabei geht es auch immer darum, dass so Leser wie ich sich eine bessere modellhafte Vorstellung davon entwickeln können, was eigentlich im Computer passiert, um mehr Selbstständigkeit entwickeln zu können UND NICHT BEI ALLEM DIE NEWS-GROUP FRAGEN ZU MÜSSEN! also, einstweilen beste Grüße, Christian Hahn. ----- Original Message ----- From: "MGE Lists" <<email address removed>> To: <<email address removed>> Sent: Monday, March 08, 2010 11:45 AM Subject: Re-2: Programm nicht 2 Mal starten Christian, zum Beenden des Programms. HastDu eventuell kein "DefaultWindow" in der App eingestellt und irgendwo "App.AutoQuit rue" eingebaut? Zum Mutex: Wie ich es im Beispiel geschrieben hatte, Du musst den Mutex in der App.Klasse als Property / Eigenschaft definieren und nicht im Open.Event. Wenn Du "dim meinMutex as Mutex" im Open.Event definierst, wird der Mutex automatisch von RB geschlossen "leave" wenn "Open.Event" abgearbeitet ist! Du willst ja aber erreichen, das der Mutex so lange existiert, bis das Programm selbst geschlossen wird. Das sollte und macht RB automatisch. Falls nicht, kannst Du im App.Close Event folgenden Code einfügen. // App.Property / Eigenschaft myMutex As Mutex // App.Open Event myMutex Mew Mutex( ExecutableFile.Name ) if Not myMutex.TryEnter then // MsgBox( "Eine Instanz des Programm läuft bereits!" ) // Quit end if // App.Close Event if myMutex <> Nil then myMutex.Leave end if Grüße Thomas Nauck -------- Original Message -------- Subject: Re: Programm nicht 2 Mal starten (07-Mrz-2010 17:11) From: Christian Hahn <<email address removed>> To: <email address removed> > Hallo, > > was ist jetzt passiert? > mit folgendem Code in App.Open startet das Programm, msgbox "läuft" kommt > auf und dann beendet sich das Programm. Eine zweite Instanz des Programms > wurde noch gar nicht versucht zu starten. > Aber jetzt! Nach Entfernung des codes, Absuchen des Windows Task-Manager > und > auch Neustart des Rechners schließt sich das Programm immer noch (obwohl > der > Code gar nicht mehr vorhanden ist). > > dim meinMutex as Mutex > meinMutex Mew Mutex( "ZensurenEingabe_19_Client.exe" ) > if Not meinMutex.TryEnter then > msgbox "kein zweiter Programmstart" > Quit > else > msgbox "läuft" > end if > > Das ist mir doch noch zu viel Rätselraten, die online-Hilfe und User's > Guide > Informationen reichen noch nicht zu meinem Verständnis. > Bisher verstehe ich: Die classes Semaphore, CriticalSection und Mutex > haben > > etwa alle die gleiche Absicht, sie reservieren die Benutzung einer sog. > resource für einen bestimmten anderen process. > Oder muss man sagen, ein process schützt sich vor der Benutzung durch > einen > > anderen process mithilfe eines Semaphore? > Davon hängt für mein Verständnis ab, wo die Klasse definiert wird und von > wem die Befehle enter und leave gesetzt werden. > Was alles kann eine resource sein? > Besonders im Falle des Mutex. Was an dem Programm wird geschützt bzw. > welche > resource versucht ein weiterer Progammstart zu benutzen? > > einstweilen beste Grüße, Christian Hahn. > > ----- Original Message ----- > From: "MGE Lists" <<email address removed>> > To: <<email address removed>> > Sent: Saturday, March 06, 2010 6:52 PM > Subject: Re: Programm nicht 2 Mal starten > > Hallo Christian, > dafür nimmst Du am besten einen Mutex der als > Property in der App.Klasse definiert ist und > versuchst ihn im App.Open Event zu setzen. > Als Property, damit er während der kompletten > Programmlaufzeit erhalten bleibt. > > // > myMutex Dew Mutex( "Programmname" ) > if Not myMutex.TryEnter then > // > Quit > end if > > Grüße > Thomas > > -------- Original Message -------- > Subject: Programm nicht 2 Mal starten (06-Mrz-2010 17:10) > From: Christian Hahn <<email address removed>> > To: <email address removed> > > Hallo, ich glaube mich zu erinnern, dass wir das hier schon 'mal hatten, > > aber ich finde es nicht wieder. > > Wie kann man verhindern, dass ein Programm nicht 2 Mal gestartet wird, > > oder > > genauer, wie kann man feststellen, ob ein Programm schon gestartet > > wurde? > > beste Grüße, Christian Hahn. > |
| Re-2: Programm nicht 2 Mal starten |
| Date: 06.03.10 18:54 (Sat, 6 Mar 2010 17:54:48 +0000) |
| From: MGE Lists |
|
Das laufende Programm kann es nicht verhindern,
das neu startende Programm muss es erkennen und sich beenden. -------- Original Message -------- Subject: Re: Programm nicht 2 Mal starten (06-Mrz-2010 18:23) From: Christian Hahn <<email address removed>> To: <email address removed> > Ja, das ist der naheliegende Gedanke. Aber geht das denn? Wie kann eine > Instanz des Programms - selbst wenn sie weiß, dass sie gestartet ist - > verhindern, dass eine weitere Instanz des Programms gestartet wird? > Gruß, Christian Hahn. > > ----- Original Message ----- > From: "Stefan Mettenbrink" <<email address removed>> > To: "REALbasic NUG German" <<email address removed>> > Sent: Saturday, March 06, 2010 5:52 PM > Subject: Re: Programm nicht 2 Mal starten > > > Christian Hahn wrote: > > > Wie kann man verhindern, dass ein Programm nicht 2 Mal gestartet wird, > > oder genauer, wie kann man feststellen, ob ein Programm schon gestartet > > wurde? > > Wie wäre es, wenn Du bei Programmstart eine temporäre Datei anlegst? > Startet das Programm erneut, ist die Datei bereites vorhanden und Du > weißt bescheit. > > MfG, Metti. > > |
| Re: Programm nicht 2 Mal starten |
| Date: 06.03.10 18:52 (Sat, 6 Mar 2010 17:52:58 +0000) |
| From: MGE Lists |
|
Hallo Christian,
dafür nimmst Du am besten einen Mutex der als Property in der App.Klasse definiert ist und versuchst ihn im App.Open Event zu setzen. Als Property, damit er während der kompletten Programmlaufzeit erhalten bleibt. // myMutex = New Mutex( "Programmname" ) if Not myMutex.TryEnter then // Quit end if Grüße Thomas -------- Original Message -------- Subject: Programm nicht 2 Mal starten (06-Mrz-2010 17:10) From: Christian Hahn <<email address removed>> To: <email address removed> > Hallo, ich glaube mich zu erinnern, dass wir das hier schon 'mal hatten, > aber ich finde es nicht wieder. > Wie kann man verhindern, dass ein Programm nicht 2 Mal gestartet wird, oder > genauer, wie kann man feststellen, ob ein Programm schon gestartet wurde? > beste Grüße, Christian Hahn. |
| Re: Programm nicht 2 Mal starten |
| Date: 07.03.10 17:11 (Sun, 7 Mar 2010 17:11:30 +0100) |
| From: Christian Hahn |
|
Hallo,
was ist jetzt passiert? mit folgendem Code in App.Open startet das Programm, msgbox "läuft" kommt auf und dann beendet sich das Programm. Eine zweite Instanz des Programms wurde noch gar nicht versucht zu starten. Aber jetzt! Nach Entfernung des codes, Absuchen des Windows Task-Manager und auch Neustart des Rechners schließt sich das Programm immer noch (obwohl der Code gar nicht mehr vorhanden ist). dim meinMutex as Mutex meinMutex )ew Mutex( "ZensurenEingabe_19_Client.exe" ) if Not meinMutex.TryEnter then msgbox "kein zweiter Programmstart" Quit else msgbox "läuft" end if Das ist mir doch noch zu viel Rätselraten, die online-Hilfe und User's Guide Informationen reichen noch nicht zu meinem Verständnis. Bisher verstehe ich: Die classes Semaphore, CriticalSection und Mutex haben etwa alle die gleiche Absicht, sie reservieren die Benutzung einer sog. resource für einen bestimmten anderen process. Oder muss man sagen, ein process schützt sich vor der Benutzung durch einen anderen process mithilfe eines Semaphore? Davon hängt für mein Verständnis ab, wo die Klasse definiert wird und von wem die Befehle enter und leave gesetzt werden. Was alles kann eine resource sein? Besonders im Falle des Mutex. Was an dem Programm wird geschützt bzw. welche resource versucht ein weiterer Progammstart zu benutzen? einstweilen beste Grüße, Christian Hahn. ----- Original Message ----- From: "MGE Lists" <<email address removed>> To: <<email address removed>> Sent: Saturday, March 06, 2010 6:52 PM Subject: Re: Programm nicht 2 Mal starten Hallo Christian, dafür nimmst Du am besten einen Mutex der als Property in der App.Klasse definiert ist und versuchst ihn im App.Open Event zu setzen. Als Property, damit er während der kompletten Programmlaufzeit erhalten bleibt. // myMutex rew Mutex( "Programmname" ) if Not myMutex.TryEnter then // Quit end if Grüße Thomas -------- Original Message -------- Subject: Programm nicht 2 Mal starten (06-Mrz-2010 17:10) From: Christian Hahn <<email address removed>> To: <email address removed> > Hallo, ich glaube mich zu erinnern, dass wir das hier schon 'mal hatten, > aber ich finde es nicht wieder. > Wie kann man verhindern, dass ein Programm nicht 2 Mal gestartet wird, > oder > genauer, wie kann man feststellen, ob ein Programm schon gestartet wurde? > beste Grüße, Christian Hahn. |
| Programm nicht 2 Mal starten |
| Date: 06.03.10 17:10 (Sat, 6 Mar 2010 17:10:57 +0100) |
| From: Christian Hahn |
|
Hallo, ich glaube mich zu erinnern, dass wir das hier schon 'mal hatten, aber ich finde es nicht wieder.
Wie kann man verhindern, dass ein Programm nicht 2 Mal gestartet wird, oder genauer, wie kann man feststellen, ob ein Programm schon gestartet wurde? beste Grüße, Christian Hahn. |
| Re: Programm nicht 2 Mal starten |
| Date: 06.03.10 20:06 (Sat, 6 Mar 2010 20:06:59 +0100) |
| From: Stefan Mettenbrink |
|
Thomas Tempelmann wrote:
> Das Ganze geht auch einfacher, indem man RB's "mutex" benutzt. Das hat > genau diese Funktionialität. Mutex kannte ich bisher nicht, hört sich aber interessant an. Meine Anwendung läd bei Programmstart alle Nutzerdaten. Könnte ich die in ein Mutex laden und dann von der Hauptanwendung ein "Modul" starten, das "nur Ausgaben" macht und dabei auf diese Daten zugreift? Ich möchte also die geladenen Daten von zwei Programmen nutzen. Da es sich hierbei eigentlich nur um ein Variablen und Arrays handelt und kein Programmcode, müsste das (der, die?) Mutex nicht einmal geperrt werden. Ist das denkbar? Gibt es dafür eine bessere Variante? MfG, Metti. |
| Re: Programm nicht 2 Mal starten |
| Date: 06.03.10 19:43 (Sat, 6 Mar 2010 19:43:50 +0100) |
| From: Stefan Mettenbrink |
|
Thomas Tempelmann wrote:
> Die bessere Lösung wäre, eine Datei nicht nur anzulegen, sondern auch > _offen_ zu halten. Denn sollte das Programm - auch unabsichtlich - > beendet werden, schließt das OS die Datei. Stimmt. MfG, Metti. |
| Re: Programm nicht 2 Mal starten |
| Date: 06.03.10 19:33 (Sat, 6 Mar 2010 19:33:07 +0100) |
| From: Christian Hahn |
|
OK, Mutex, ich fang' schon an zu lesen (lern ich wieder was). Aber
vermutlich muss ich dann noch 'mal damit kommen. einstweilen besten Dank, Christian Hahn. ----- Original Message ----- From: "Christian Hahn" <<email address removed>> To: "REALbasic NUG German" <<email address removed>> Sent: Saturday, March 06, 2010 5:10 PM Subject: Programm nicht 2 Mal starten Hallo, ich glaube mich zu erinnern, dass wir das hier schon 'mal hatten, aber ich finde es nicht wieder. Wie kann man verhindern, dass ein Programm nicht 2 Mal gestartet wird, oder genauer, wie kann man feststellen, ob ein Programm schon gestartet wurde? beste Grüße, Christian Hahn. |
| Re: Programm nicht 2 Mal starten |
| Date: 06.03.10 19:21 (Sat, 6 Mar 2010 19:21:17 +0100) |
| From: Stefan Mettenbrink |
|
Christian Hahn wrote:
> Ja, das ist der naheliegende Gedanke. Aber geht das denn? Wie kann > eine Instanz des Programms - selbst wenn sie weiß, dass sie gestartet > ist - verhindern, dass eine weitere Instanz des Programms gestartet > wird? Es kann dadurch sicher nicht verhindert werden, dass das Programm erneut gestartet wird. Aber wenn Du bei Programmstart erkennst, dass das Programm schon gestartet wurde, kannst Du das Programm gleich wieder beenden. Das ganze hat nur einen Haken. Wenn Dein Programm gekillt wird oder abstürzt, bleibt die temporäre Datei zurück und Du kannst es erst wieder starten, wenn Du die temporäre Datei löschst. Sicherer wäre es, wenn Du erkennen könntest, welche Programme derzeit laufen. Keine Ahnung, wie man das abfragt. Da fällt mir noch eine kompliziertere Idee ein. Du kannst die temporäre Datei mit einem festgelegtem Text versehen. Wenn die Datei bei Programmstart vorhanden ist, veränderst Du den Text. Die Laufende Anwendung muss dann nur rgelmäßig die Datei und den Text prüfen und ggf. zurücksetzen. Dann erkennst Du auch laufende Programme. Reichlich Aufwand. Keine Ahnung, ob das lohnt. MfG, Metti. |
| Re: Programm nicht 2 Mal starten |
| Date: 06.03.10 19:46 (Sat, 06 Mar 2010 19:46:31 +0100) |
| From: Achim Kredteck |
|
Hallo, ich hab einen Updater, der vor dem Überschreiben der alten
Programmexe prüft, ob das Programm gerade läuft, es wenn ja, dann beendet, und den Kopiervorgang dann erst auslöst. Vielleicht hift dieser Codeausschnitt............................. (Bei Win2000 muß die kill.exe ins system32, kann man runterladen.............) OSwn32DeclareLibrary.OSVersionString apps ein32DeclareLibrary.GetActiveProcessNames prozesstin(apps,"|") countÀuntfields(prozess,"|") for i to count -1 appelement{pps(i) if appelementmEIN PROGRAMM.exe" then if OS.left(12)oindows 2000" then cmd akill DEIN PROGRAMM.exe" else cmd ataskkill /IM DEIN PROGRAMM.exe" MsgBox "Dolekas wurde auf WinXP oder höher beendet" end if elseif appelementoEIN PROGRAMM.exe" then if OS.left(12)windows 2000" then cmd ;kill DEIN PROGRAMM.exe" MsgBox "Dolekas wurde auf Win2000 beendet" else cmd etaskkill /IM DEIN PROGRAMM.exe" MsgBox "Dolekas wurde auf WinXP oder höher beendet" end if sh.execute cmd end if next Grüße Achim |
| Re: Programm nicht 2 Mal starten |
| Date: 06.03.10 18:53 (Sat, 6 Mar 2010 18:53:07 +0100) |
| From: Thomas Tempelmann |
|
2010/3/6 Stefan Mettenbrink <<email address removed>>:
> Wie wäre es, wenn Du bei Programmstart eine temporäre Datei anlegst? Startet > das Programm erneut, ist die Datei bereites vorhanden und Du weißt bescheit. Denk mal darüber nach, was passieren würde, wenn das Programm abstürzt. Dann bleibt nämlich die Datei dort und beim nächsten Start denkt das Programm, da liefe schon eins, und dabei stimmt das gar nicht. Die bessere Lösung wäre, eine Datei nicht nur anzulegen, sondern auch _offen_ zu halten. Denn sollte das Programm - auch unabsichtlich - beendet werden, schließt das OS die Datei. Beim Start muss daher dann nur probiert werden, die Datei neu anzulegen - schlägt das fehl, weil schon eine mit dem Namen offen ist, dann läuft da schon ein Prg. Das Ganze geht auch einfacher, indem man RB's "mutex" benutzt. Das hat genau diese Funktionialität. Und Christian - _verhindern_ kann man so den 2. Start nicht, sondern du mußt in deinem App.Open-Event selbst prüfen, ob da schon eine Kopie läuft und sich dann ggf. selbst wieder beenden. Klar? |
| Re: Programm nicht 2 Mal starten |
| Date: 06.03.10 17:52 (Sat, 6 Mar 2010 17:52:46 +0100) |
| From: Stefan Mettenbrink |
|
Christian Hahn wrote:
> Wie kann man verhindern, dass ein Programm nicht 2 Mal gestartet wird, oder genauer, wie kann man feststellen, ob ein Programm schon gestartet wurde? Wie wäre es, wenn Du bei Programmstart eine temporäre Datei anlegst? Startet das Programm erneut, ist die Datei bereites vorhanden und Du weißt bescheit. MfG, Metti. |
| Re: Programm nicht 2 Mal starten |
| Date: 06.03.10 18:23 (Sat, 6 Mar 2010 18:23:29 +0100) |
| From: Christian Hahn |
|
Ja, das ist der naheliegende Gedanke. Aber geht das denn? Wie kann eine
Instanz des Programms - selbst wenn sie weiß, dass sie gestartet ist - verhindern, dass eine weitere Instanz des Programms gestartet wird? Gruß, Christian Hahn. ----- Original Message ----- From: "Stefan Mettenbrink" <<email address removed>> To: "REALbasic NUG German" <<email address removed>> Sent: Saturday, March 06, 2010 5:52 PM Subject: Re: Programm nicht 2 Mal starten Christian Hahn wrote: > Wie kann man verhindern, dass ein Programm nicht 2 Mal gestartet wird, > oder genauer, wie kann man feststellen, ob ein Programm schon gestartet > wurde? Wie wäre es, wenn Du bei Programmstart eine temporäre Datei anlegst? Startet das Programm erneut, ist die Datei bereites vorhanden und Du weißt bescheit. MfG, Metti. |
Links
MBS Realbasic PDF Plugins - Nachhilfe in Kell