Zum Inhalt springen

Programm nur 1x ausführbar machen


Empfohlene Beiträge

Geschrieben

Hi,

Ich suche eine saubere Möglichkeit, das mehrfache Ausführen von einem Programm zu verbieten.

Ich habe schon versucht mit dem Singelton-Prinzip die Main-Klasse nur einmal instanzierbar zu machen, jedoch wird die View zwei mal erzeugt, wenn ich das Programm zwei mal starte :beagolisc

Geschrieben

Das Problem wirst du in Java nicht gelöst bekommen. Denn wenn dein Programm gestartet wird bekommst du einen Java Prozess im System unter dem es läuft. Wenn du dein Programm ein zweites mal startest bekommst du einen zweiten java Prozess dieser weiß aber von deinem ersten Prozess nichts und dann auch nichts von deinem Singleton in deinem ersten Programm.

Was möglich wäre, ist das du in deinem Programm schaust ob es schon einen Java Prozess mit deinem Programm gibt und dann dein zweites Programm nicht noch einmal starten. Das ist aber in meinen Augen keine saubere Lösung. Denn du musst ganz genau schauen das es wirklich dein Java Prozess ist denn es kann durchaus sein das es noch andere Java Prozesse gibt.

Weitere Möglichkeit ist du schreibst eine lock Datei. Hat aber den Nachteil das du auch dafür sorgen musst das diese Datei nach einem Programmabsturz wieder weg geräumt wird.

Gast runtimeterror
Geschrieben (bearbeitet)

Die Methode mit dem Port setzt allerdings voraus, dass keine Firewall das blockiert, der Port nicht durch eine völlig andere Anwendung benutzt wird und dass überhaupt ein IP-Stack auf dem Gerät installiert ist. Mir wäre das zu heikel.

Ich kann die Methode FileChannel.tryLock() auf eine bestehende Datei empfehlen - da sehe ich keinerlei Nachteile.

Nachtrag:

Der verlinkte Code spezifiziert keine IP-Adresse - wenn sich zwischen den beiden Anwendungen das Default-Adapter ändert, dürfte das meinem Verständnis nach nicht richtig funktionieren. Hierfür sollte man InetAddress.getLoopbackAddress() nutzen.

Bearbeitet von runtimeterror
Hinweis auf IP vs. Loopback eingefügt
Gast runtimeterror
Geschrieben

Prozesse auslesen bringt aber bei Java nichts, da sich die laufenden JVMs nicht unterscheiden lassen. Es gibt ein paar komplizierte Tricks, die JVM-Instanzen beim Start über einen Launcher entsprechend zu benennen - einfacher ist es jedoch auf einen Lock-Mechanismus des Betriebssystems zurückzugreifen.

Geschrieben
Die Methode mit dem Port setzt allerdings voraus, dass keine Firewall das blockiert,...

Das wäre mir eigentlich auch zu heikel, allerdings ist für das Programm sowieso eine Soketkommunikation vorgesehen, dafür werden schon Ports belegt (damit andere Programme mit diesem kommunizieren können) von daher gehe ich das Risiko einfach ein :D

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...