![]() |
|
|||||||
| Codeschnipsel u. Projekte Ihr möchtet eure Projekte vorstellen, oder interessante, innovative Codefragmente diskutieren? Dann bitte hier! |
|
|
|
Themen-Optionen | Thema durchsuchen | Ansicht |
| #1 (permalink) | |
|
Stammbenutzer
Viertel Megabyte
Registriert seit: 22.05.2010
Fachbeiträge: 272
Abgegebene Danke: 0
Erhielt 40 Danke für 39 Beiträge
|
Hey Leute,
ich habe mich mal dran gemacht, und eine Klasse geschrieben, mit der es einfach möglich ist nur eine Instanz eines Programmes zu haben. Schaut sie euch doch einfach mal an: https://bitbucket.org/mjdv/jsingleinstance/wiki/Home Würde mich über Feedback jeglicher Art freuen, ich hoffe es ist alles selbsterklärend und die Dokumentation halbwegs verständlich
|
|
|
|
| #3 (permalink) | |
|
Stammbenutzer
Viertel Megabyte
Themenstarter
Registriert seit: 22.05.2010
Fachbeiträge: 272
Abgegebene Danke: 0
Erhielt 40 Danke für 39 Beiträge
|
Wenn du sowas meinst wie:
Dann könnte ich das sicherlich noch einbauen ![]() Kannte das vorher noch gar nicht ![]() edit: implementiert, hat bei mir gefunzt. Und noch zwei bugs gefixt ![]() Denke jetzt funktioniert das ganze schon ganz gut. Geändert von mjdv (19.06.2011 um 17:22 Uhr) |
|
|
|
| #4 (permalink) | |
|
Java-Forum Team
IRC-Operator (Java-Chat)
Moderator Registriert seit: 17.08.2007
Fachbeiträge: 7.461
Abgegebene Danke: 70
Erhielt 566 Danke für 525 Beiträge
|
Nette Idee
Werde ich mir die Tage mal genauer ansehen.
__________________
Lycia: Listener principle based XML Processor http://code.google.com/p/lycia Apache Lightning: Fast Pojo-Serializer http://directmemory.apache.org/lightning Apache DirectMemory: BigMemory like in-memory cache http://directmemory.apache.org |
|
|
|
| #5 (permalink) | |
|
Stammbenutzer
Viertel Megabyte
Themenstarter
Registriert seit: 22.05.2010
Fachbeiträge: 272
Abgegebene Danke: 0
Erhielt 40 Danke für 39 Beiträge
|
@Noctarius, und shcon mal angesehen? Irgendwelche Tipps?
Ich hab nochmal ein paar Änderungen hinzugefügt. Die sendCommand() Methoder hat nun ein timeout von 5 sec. wenn nicht innerhalb von diesem timout ein OK von der beretis laufenenden Instanz kommt, wird false returned, und davon ausgegangen, dass die laufende Instanz abgestürzt ist und nur der Server Thread noch läuft. Das timeout kann man via setTimeout(int secs) setzen. Man sollte also in der OnCommand() Methoder schnell das Kommando interpretieren und ausführen, und dann returnen, damit das timeout nicht überschritten wird. Das OK wird automatisch nach dem returnen gesendet. Eine weitere Funktion ist forceExit(), hiermit kann man der anderen Instance sagen sich zu beenden, eben wenn diese abgestürzt zu sein scheint. JSingleInstance fürht dann einfach System.exit(-1) aus. Meint ihr das macht so Sinn? Als weiteres Feature ist geplant, dass man vll. einen JFrame übergeben kann, und man dann einfach diesen wieder in den Vordergrund holen kann via activateWindow(). Das spart einem, so ein Command immer selber implementieren zu müssen, was ja schon recht lästig sein kann. edit: des weiteren wurde das Beispiel ein wenig verbessert
|
|
|
|
| #6 (permalink) | |
|
Java-Forum Team
Moderator
Registriert seit: 06.01.2007
Fachbeiträge: 16.993
Abgegebene Danke: 0
Erhielt 1.669 Danke für 1.512 Beiträge
|
Ich kann das gerade nicht ganz einordnen, aber kann es sein, dass man "Threads die eigentlich wegen eines abgestürzten Programmes tot sein sollten, aber dummerweise noch leben" durch ein
thread.setDaemon(true); vor dem thread.start() verhindern könnte...? EDIT: Äh nee... warte... kann sein dass das Unfug war... später nochmal überlegen
|
|
|
|
| #7 (permalink) | |
|
Stammbenutzer
Viertel Megabyte
Themenstarter
Registriert seit: 22.05.2010
Fachbeiträge: 272
Abgegebene Danke: 0
Erhielt 40 Danke für 39 Beiträge
|
Naj, generell stimmt das schon. Aber der Server Thread wird sowieso beim beenden ducrch den shutdownHook abgewürgt. Es könnte höchstens noch ein Thread laufen, der die Clients handled. Vll. sollte man dort noch setDeamon(true) setzen.
|
|
|
|
| #8 (permalink) | |||||
|
Projektleiter RPGenesis
Team RPGenesis
Registriert seit: 03.05.2009
Fachbeiträge: 815
Abgegebene Danke: 10
Erhielt 96 Danke für 95 Beiträge
|
Hm, was mir als Verbesserungsvorschlag vielleicht noch einfallen würde: beseitige die Abhängigkeit von einer Datei. Derzeit müssen die Informationen über die Prozesskommunikation ja in einer Datei abgelegt werden, was unter Umständen ja nicht gewünscht sein könnte. Stattdessen wäre es vielleicht besser, JSingleInstance eine Art Initialisierungsobjekt zu übergeben, welches die Art der Kommunikation festlegt und sich um den Aufbau kümmert. Etwas, was in der Benutzung etwa in diese Richtung geht:
__________________
Geändert von Gastredner (06.07.2011 um 22:17 Uhr) |
||||
|
|
|
| #9 (permalink) | |
|
Stammbenutzer
Viertel Megabyte
Themenstarter
Registriert seit: 22.05.2010
Fachbeiträge: 272
Abgegebene Danke: 0
Erhielt 40 Danke für 39 Beiträge
|
Hi, sry das ich mich jetzt erst melde. Erstmal danke für dein Feedback
Stimmt, dass man vll. einen eigenen Port abgeben kann macht vll. Sinn. Aber ist es nicht einfacher, dafür einfach einen eigenen Konstruktor zu machen? Wenn nicht, wie sollte dann so ein Init Klasse aussehen? Und das mit der Pipe verstehe ich nicht ganz, wie darf ich mir das denn vorstellen? |
|
|
|
| #10 (permalink) | |||||||||||||||||||||||||||||||||||||||||||||||||||
|
Projektleiter RPGenesis
Team RPGenesis
Registriert seit: 03.05.2009
Fachbeiträge: 815
Abgegebene Danke: 10
Erhielt 96 Danke für 95 Beiträge
|
__________________
Geändert von Illuvatar (11.07.2011 um 21:07 Uhr) Grund: List-Tags korrigiert |
||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||
| #12 (permalink) | |
|
Stammbenutzer
Viertel Megabyte
Themenstarter
Registriert seit: 22.05.2010
Fachbeiträge: 272
Abgegebene Danke: 0
Erhielt 40 Danke für 39 Beiträge
|
Hi CHAOSFISCH,
naja nicht wirklich mehr daran gearbeitet, da ich nicht weiß was man noch implementieren könnte, für meine Anwendungsfälle reicht es aus. Gastredner hat sich auch leider nicht mehr gemeldet ![]() Wo genau liegt denn dein Problem? |
|
|
|
| #13 (permalink) | |||
|
Stammbenutzer
Kilobyte
Registriert seit: 11.06.2011
Fachbeiträge: 141
Abgegebene Danke: 0
Erhielt 0 Danke für 0 Beiträge
|
Ja z.B steht dort:
Mal abgesehen das hier einige Fehler drinnen sind z.b. .length ohne () und eine weitere fehlende Klammer ) danach und ein s bei startsWith fehlt. 1. Woher nimmst du open() ? 2. Ich hab mein Beispiel so probiert: Heißt ich hab 2 Instanzen erstellt, die Meldung das die Anwendung bereits läuft kam, aber die Instanz wurde nicht beendet!? Zudem bekomme ich immer 2 SocketExceptions |
||
|
|
|
| #14 (permalink) | |
|
Stammbenutzer
Viertel Megabyte
Themenstarter
Registriert seit: 22.05.2010
Fachbeiträge: 272
Abgegebene Danke: 0
Erhielt 40 Danke für 39 Beiträge
|
Hi,
ja du hast recht, den wiki Text sollte ich nochmal überarbeiten. Die Idee des Beispiels ist, wenn du zB einen TextEditor hast, der schon läuft und jemand auf eine Text Datei klickt, sollte sich ja dein Editor öffnen. Wenn er jetzt schon läuft, wird an die laufende Instanz gesendet bitte öffne diese Datei, also die die als Argument in argv[1] mitgegeben wurde. open() ist dann natürlich eine Funktion in deiner Applikation die die Datei öffnet und in der Appliaktion anzeigt. open() ist natürlich nicht in dem Beispiel implementiert, es sollte nur eine möglich Demonstration sein. Das mit forceExit() ist ein sehr peinlicher bug , den werde ich noch heute beheben // behobenAber wieso willst du die Applikation sofort beenden wenn sie läuft? Das macht doch keinen Sinn. Ja die SocketExceptions kommen zB beim Beenden, da ich einfach den accept() Aufruf abwürge, aber das sollte nicht tragisch sein, die kannst du einfach ignorieren. Geändert von mjdv (08.08.2011 um 16:41 Uhr) |
|
|
|
| #15 (permalink) | |||||||||||||||||||
|
Stammbenutzer
Kilobyte
Registriert seit: 11.06.2011
Fachbeiträge: 141
Abgegebene Danke: 0
Erhielt 0 Danke für 0 Beiträge
|
Ansonsten, sehe ich es richtig, dass du in der vom Programm erstellten Datei die PID speicherst? |
||||||||||||||||||
|
|
|
||||||||||||||||||
| #16 (permalink) | |
|
Stammbenutzer
Viertel Megabyte
Themenstarter
Registriert seit: 22.05.2010
Fachbeiträge: 272
Abgegebene Danke: 0
Erhielt 40 Danke für 39 Beiträge
|
Achso, ja dann hast du das ja richtig gelöst (sofern du vorher noch den DIalog zeigst), war nur etwas verwirrt
![]() Nein, es war zwar der Plan, die PID zu speichern, aber ich habe in Java keine Möglichkeit gefunden zu überprüfen ob ein Prozess mit einer bestimmten PID noch läuft. Aber das ist sowieso unnötig eigentlich, da wenn die Anwendung nicht mehr läuft, ich mich auch nicht zu dieser per Sockets verbinden kann. Somit wird in der Datei nur der Port gespeichert auf dem nach Meldungen gehorcht wird. |
|
|
|
| #18 (permalink) | |
|
Stammbenutzer
Kilobyte
Registriert seit: 11.06.2011
Fachbeiträge: 141
Abgegebene Danke: 0
Erhielt 0 Danke für 0 Beiträge
|
So
![]() Evtl. nochmal nen Bug gefunden: Wenn die Datei schon existiert, weil sie nicht gelöscht wurde, dann gibts nen bug. Dann kann man 2 Instanzen wieder starten. 2 mögliche Fehlerquellen: Es wird überprüft ob eine Sockerverbindung aufgebaut werden kann -> Ja -> Verbindung wird beendet und es wird auf einen neuen Port connected der nicht abgespeichert wird. 1. Falscher connect port 2. Fehlender Dateizugriff 1 von beiden wird wohl nicht richtig sein. |
|
|
|
| #20 (permalink) | |
|
Stammbenutzer
Kilobyte
Registriert seit: 11.06.2011
Fachbeiträge: 141
Abgegebene Danke: 0
Erhielt 0 Danke für 0 Beiträge
|
Kann ich nicht genau sagen.
Es kann sein das die VM von außen beendet wurde und die Datei dadurch nicht gelöscht worden ist. Auf alle Fälle: Wenn die Datei schon existiert funktioniert es nicht mehr, und dass ist dann meines achtens ein Bug :P |
|
|
|
|
| Themen-Optionen | Thema durchsuchen |
| Ansicht | |
Ähnliche Themen
|
||||
| Thema | Autor | Forum | Antworten | Letzter Beitrag |
| Java Applet - Breakout Game | Cloud1993 | Spiele- und Multimedia-Programmierung | 0 | 07.04.2011 09:18 |
| (2D-Grafik) Vier gewinnt Problem | Vancold | Allgemeine Java-Themen | 5 | 18.11.2010 11:28 |
| Zeichnung verschwindet hinter Bild | _fabi | Java Basics - Anfänger-Themen | 2 | 07.01.2009 02:14 |
| nur eine Instanz eines Programms laufen lassen | bubzilla | Allgemeine Java-Themen | 8 | 15.08.2005 16:49 |
| Nur eine Instanz eines Programms zulassen, wie geht das? | philo | Allgemeine Java-Themen | 15 | 20.08.2004 19:24 |
| Lesezeichen |
|
|