läuft mein Programm schon? - wie feststellen

Status
Nicht offen für weitere Antworten.
T

thomas.g

Bekanntes Mitglied
Hi,

ich habe ein großes Problem, ich möchte, dass mein Programm nur einmal aufgerufen wird, und wenn man nochmal auf das jar klick soll es sich nicht nochmal öffnen.

Wie kann ich also feststellen, ob mein Programm bereits ausgeführt wird?
Es wäre auch günstig, wenn ich dem bereits laufenden Programm daten von einem anderen Programm übergeben könnte ....

naja, das ganze ist so: Ich programmiere einen MediaPlayer und wenn man eine wav datei anklickt und der Player bereits ausgeführt wird soll sich kein neuer öffnen sondern diese wav datei im bereits ausgeführten player wiedergegeben werden .....

Wenn das jemand weiß, bitte posten!

thx, thomas
 
K

KSG9|sebastian

Top Contributor
Problem ist, dass für jede Anwendung ne eigene VM gestartet wird, somit kommst du mit nem Singleton-Pattern nicht wei.

Die einzige Möglichkeit die ich wüsste wäre folgende:

Wenn dein Proggy zum ersten mal aufgerufen wird schreibst du ne Datei irgendwo hin. Am besten Temp oder sowas. Dann überprüfst du in der main eben immer, ob das Programm schon existiert.

Code:
main(){
   File f = new File("c:/Temp/meinProgy.abc");
   if(f.exists()){
      //abbrechen, proggy läuft schon
   } else{
      f.createNewFile();
      f.deleteOnExit();  
      //Proggy starten
   }
}


Natürlich solltest du den Pfad wo die Datei gespeichert wird nicht hardcoden sondern über ne Systemproperty einlesen.
 
K

KSG9|sebastian

Top Contributor
Zum Thema kommunikation:

Ich wüsste nur eine, unsaubere Lösung:

Bei Programmstart erstellst du dir nen ordner im Temp-Ordner.
Dann hängst du da nen DirectoryListener rein, der den Ordner scannt. Wenn ne neue Datei hinzukommt bearbeite sie.
In die Datei kannst du z.B. den Pfad der zu spielenden Datei schreiben. Dann löschst du die Datei wieder.

Beispiel

deine main methode

Code:
main(){ 
   File f = new File("c:/Temp/meinProgy.abc"); 
   if(f.exists()){ 
      File play = new File("c:/Temp/blahblub/datei.abc);
      FileWriter writer = new FileWriter(play);
      writer.writeln(<pfad zur wav datei>);
      writer.flush();
      writer.close();
      //jetzt proggy beenden
   } else{ 
      f.createNewFile(); 
      f.deleteOnExit();  
      //Proggy starten 
   } 
}


DirectoryMonitor
Code:
import java.io.File;
import java.io.FileFilter;
import java.util.HashMap;
import java.util.Vector;

public class DirectoryMonitor implements Runnable {
	private long interval;

	private File directory;

	private Thread monitor;

	private Vector listeners;

	private boolean stopped;

	private boolean daemon;
	
	private static final FileFilter filter = new FileFilter() {
	
		public boolean accept(File arg0) {
			return true;
		}
	
	};

	public DirectoryMonitor(String directory, long interval) {
		this.interval = interval;
		this.directory = new File(directory);
		if (!this.directory.exists() && !this.directory.canRead()
				|| !this.directory.isDirectory())
			throw new IllegalArgumentException("Fehler");
		listeners = new Vector();
	}

	public void addDirectoryChangeListener(DirectoryChangedListener dcl) {
		listeners.add(dcl);
	}

	public void removeDirectoryChangeListener(DirectoryChangedListener dcl) {
		listeners.remove(dcl);
	}

	public void startMonitoring() {
		stopMonitoring();
		stopped = false;
		monitor = new Thread(this);
		monitor.setDaemon(daemon);
		monitor.start();

	}

	public void stopMonitoring() {
		stopped = true;
		try {
			if (monitor != null) {
				monitor.interrupt();
				monitor.join();
			}
		} catch (InterruptedException e) {
		}
		monitor = null;

	}

	public void setDaemon(boolean daemon) {
		daemon = daemon;
		if (monitor != null) {
			monitor.setDaemon(daemon);
		}
	}

	public void run() {
		File[] prevList = directory.listFiles(filter);
		checkAdditions(prevList, new HashMap());
		HashMap prevMap = toMap(prevList);

		while (true) {
			try {
				Thread.sleep(interval);
			} catch (InterruptedException e) {
				// ignore
			}
			if (stopped == true) {
				return;
			}
			File[] currList = directory.listFiles(filter);
			HashMap currMap = toMap(currList);
			checkAdditions(currList, prevMap);
			checkRemovals(prevList, currMap);
			prevList = currList;
			prevMap = currMap;
		}

	}

	private HashMap toMap(File[] files) {
		int len = files.length;
		HashMap map = new HashMap();
		for (int i = 0; i < len; ++i) {
			map.put(files[i].toString(), files[i]);
		}
		return map;
	}

	private void checkAdditions(File[] curr, HashMap prev) {
		int len = curr.length;
		int type = DirectoryChangedEvent.FILE_ADD;
		for (int i = 0; i < len; ++i) {
			if (prev.get(curr[i].toString()) == null) {
				DirectoryChangedEvent dce = new DirectoryChangedEvent(curr[i],
						type);
				fireNotify(dce);
			}
		}
	}

	private void checkRemovals(File[] prev, HashMap curr) {
		int len = prev.length;
		int type = DirectoryChangedEvent.FILE_REM;
		for (int i = 0; i < len; ++i) {
			if (curr.get(prev[i].toString()) == null) {
				DirectoryChangedEvent dce = new DirectoryChangedEvent(prev[i],
						type);
				fireNotify(dce);
			}
		}
	}

	private void fireNotify(DirectoryChangedEvent dce) {
		Vector list = (Vector) listeners.clone();
		int len = list.size();
		for (int i = 0; i < len; ++i) {
			DirectoryChangedListener dcl = (DirectoryChangedListener) list
					.get(i);
			dcl.directoryChanged(dce);
		}
	}

}

DirectoryChangedListener

Code:
public interface DirectoryChangedListener {

	public void directoryChanged(DirectoryChangedEvent evt);

}

DirectoryChangedEvent

Code:
import java.util.EventObject;

public class DirectoryChangedEvent extends EventObject{
	public static int FILE_ADD = 0;
	
	private int typ;
	
	public DirectoryChangedEvent(Object source, int typ){
		super(source);
		this.typ = typ;
	}
	
	public int getTyp(){
		return typ;
	}

}


Initialisierung des Listeners:

Code:
DirectoryMonitor dm = new DirectoryMonitor("c:/Temp/blahblub/", 500);

		dm.addDirectoryChangeListener(new DirectoryChangedListener() {

			public void directoryChanged(DirectoryChangedEvent dce) {
				File file = (File) dce.getSource();
				if (dce.getTyp() == DirectoryChangedEvent.FILE_ADD) {

					//datei einlesen und wieder löschen
                                                                         
				} 
			}

		});
		dm.setDaemon(true);
		dm.startMonitoring();


Den FileFilter musst du anpassen (DirectoryMonitor). Den ScanPfad musst du anpassen (Initialisierung des Listeners).
Deine Main musst du auch anpassen ;)
 
T

thomas.g

Bekanntes Mitglied
naja, das sind schon mal gute antworten an die ich gar nicht gedacht habe, aber wie sieht es mit der Performance aus, wenn ich von mir aus jede Sekunde den Ordner nach neuen Aufgaben scanne? Mein Player braucht ohne hin schon 30 % auslastung von meinem AMD Athlon (1,1Ghz); allerdings nur im Vollbetrieb. Bei einem solchen "scan" verfahren würde es zwar gehen aber ich glaube, dass die performance darunter leidet. Ich werde es einfach mal versuchen und bin sehr dankbar für diese Lösung. Ich dachte nämlich, dass das mit der Klasse "System" gehen könnte, fand aber nichts passendes.

Ich würde den Vorschlag mit dem Temp Directory sofort umsetzen, nur ist der Player ohnehin schon "etwas" langsamer, da ich Swing verwende, um ihn auch unter linux betreiben zu können. Ich habe ihn ja deswegen mit meinen Kollegen entwickelt, unter der Vorrausetzung, einen schnellen Player zu erstellen der viele Funktionen bietet und auch Linux fähig ist; weiters auch Benutzerfreundlich aufgebaut ist. Eigentlich hätte ich bereits alles nötige mal Programmiert, mir fehlt nur noch der .cda Support und eventuell eine Brenn-funktion zum brennen von CDs was glaube ich aber nicht möglich ist.

Er kann jetzt von Microphon und Digital-Kamera sachen aufnehmen, in andere Formate exportieren, Playlists, MP3 ID3 Daten lesen/ändern/erstellen, Spiele, Such-Tools, DVD spielen unter Windows (voraussetzung PowerDVD installiert, möchte aber JFFMPEG dafür verwenden, um auf den Codec von PowerDVD zu verzichten), Bilder anzeigen/bearbeiten/exportieren, mit Java3D Plugins 3d datein anzeigen, Visualisierungen, kleine Analyse Tools, abspielen aller Formate die JMF unterstüzt.

Mich würde weil es gerade hier dazu passt gerne interessieren: Was erwartet ihr euch von einem Player der Freeware/Open-Source ist; was sollte er können, was abspielen, wie aussehen ......

thx, thomas
 
K

KSG9|sebastian

Top Contributor
du kannst theoretisch schon brennen, halt nur über nen process..guck dir mal das da an:

http://www.gnu.buildtolearn.net/documentation/swt/online/single/index.html#d0e740

Da steht vll. wie es geht..!

Was ich generell von nem Player verlange:

- Geschwindigkeit spielt nicht sooo eine große Rolle, solange ich nicht ewige Wartezeiten hab.
- Er sollte sämtliche Formate abspielen können, nach Möglichkeit OHNE 100 Codecs zu installieren
- Visualisierung ist mir sch**s egal
- Er sollte Videos abspielen können (auch alle Formate)
- Man sollte Einstellungsmöglichkeiten bei Videos haben (Bild an Bildschirm anpassen, Prozentual vergrößern, Helligkeit anpassen u.s.w.)
- Er sollte AUF JEDEN FALL auch über nen TV-Out an den Fernseher gepackt werden können (Zoomplayer kann das z.B. nicht)
- Benutzerfreundlich, d.h.: EIN Fenster und Optionen erscheinen in nem Dialog, keine überfüllten Rechtsklick-Menüs...

hm..was noch..kA

Ach ja, der DirectoryScanner ist meiner Meinung nicht sonderlich langsam. Ich denke auch net, dass der den Recher arg belastet.
Du musst nur ne möglichkeit finden, wie du die Infos über den abzuspielenden Song gescheit in der Datei speicherst.

Andere Möglichkeit die mir gerade einfällt (dürfte ziemlich schnell sein):

Lass intern in deinem Programm nen Server laufen. Wenn das Programm ein zweites mal gestartet wirt (anhand einer DAtei überprüfen) baust du ne Socket-Verbindung zum Server auf und schickst den Pfad zum abzuspielenden Song)

Pseudocode

Programm starten
Programm zum ersten mal gestartet?
:ja
programm ganz normal laden
serversocket öffnen und an localhost, port xyz lauschen lassen
fortfahren mit dem programm
:nein //programm "doppelt"
Clientverbindung (socket) zu localhost, port xyz aufbauen
pfad zu der zu spielenden datei senden
verbindung schließen
programm beenden

: hauptprogramm
server akzeptiert verbindung
server öffnet den inputstream
server liest eine zeile
server schließt verbindung auf wartet erneut auf connect
datei abspielen



Codebeispiele

Code:
public static void main(String[] args){
   File f = new File("c:/Temp/meinProgy.abc"); 
   if(f.exists()){ 
      //abbrechen, proggy läuft schon 
      startClient(args[0]);
   } else{ 
      f.createNewFile(); 
      f.deleteOnExit();  
      //Proggy starten 
     startServer();
   } 
}

public void startServer(){
  ServerSocket sock = new ServerSocket(80);
  while(true){
      Socket socket = sock.accept();
      BufferedReader reader = new BufferedReader(InputStreamReader(sock.getInputStream()));
      String line = reader.readLine();
      reader.close();
      socket.close();
      playSong(line);
  }
}

public void startClient(String pathToSong){
  Socket socket = new Socket("localhost", 80);
  BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
  writer.writeln(pathToSong);
  writer.write("\r\n");  // weiß net genau ob du das explizit mit senden musst
  writer.flush();
  writer.close();
  socket.close();
  System.exit(1);
}

Vielleicht gibts ne schnellere Möglichkeit als ne SocketVerbindung, keine Ahnung...

Edit:

Ich weiß net genau, was passiert wenn dein programm durch nen Doppelklick auf ne .wav Datei gestartet wird. Wird als Argument der Pfad zur exe übermittelt ? Oder wird ein File übergeben ?
Ich bin davon ausgegangen, dass als Argument(0) der Pfad übermittelt wird
 
T

thomas.g

Bekanntes Mitglied
Der Pfad zur Datei wird auch als args in der main Methode übermittelt sodass eine Datei eingentlich gar nicht nötig ist.

Zur deiner Meinung mit den vielen Kontextmenü Lösungen kann ich entwarnung geben, ich hasse auch nichts mehr wenn man alles über Kontextmenü steuern muss. Also habe ich einfach beides gemacht. Ich habe wie man es vom Windows Media Player kennt die Tapps oben eingefügt, die direkt ein Optionen Fenstern im Player aufrufen, bei Klick auf Wiedergabe kommt halt wieder die Playlist und die Visualisierung. Außerdem lässt sich das ganze mit Shortcuts (Tastatur) steuern.

Zu der Frage mit den Formaten: Sicherlich kenne ich mittlerweile Mittel und Wege, wie ich mit JMF so ziemlich alles native, allso ohne Windows Codecs abspielen kann. Sogar DVD, SVideo, DivX etc. Leider bin ich mir nicht ganz über den Rechten im klaren. Ich gehe eher auf Nummer sicher alls in Rechtsstreit zu geraten. Wenn sich da wer besser über Media-Patente auskennt, dann bitte posten. Den wenn ich z.B. FFMPEG ohne weiteres einbinden darf wäre die Palette der Formate auch für Linux User größer. Unter Windows nutzt JMF ja die Windows Codecs was finde ich nicht gut ist, den für was hat man den einen Player, wenn man erst wieder den Windows Media Player installieren muss, damit was geht. Klar biete JMF wav, mp3, au, avi, mov und gsm support, aber das ist meiner Meinung nach nicht genug.

Vor kurzem habe ich das mit dem Server probiert und es geht, ich kann auf mein Programm zugreifen. Außerdem kann ich durch einen "Hello" aufruf, allso schicke diese Nachricht an den Server und kommt was zurück, dann weiß ich, aha, der player läuft bereits.

Bin weiter auf eure Meinung gespannt und bedanke mich vorerst mal für die Idee mit dem Server.

thx, thomas
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
itwestnet Mein Java-Programm läuft nicht in China Allgemeine Java-Themen 4
R Mein Applet läuft in der IDE aber nicht. Allgemeine Java-Themen 2
D Twitch API mit HttpURLConnection läuft nicht? Allgemeine Java-Themen 0
T PDF-Generierung (itext) - läuft unter Eclipse, bei har aber leere Seite Allgemeine Java-Themen 39
S Korrekte Pfadangaben damit eine .jar Datei unter Windwos läuft. Allgemeine Java-Themen 24
E JavaFX RMI extrem langsam wenn Server nicht läuft Allgemeine Java-Themen 5
H Alter Java-Programm läuft nicht mehr. Laut strace fehlt libpthread.so.0 Allgemeine Java-Themen 3
P Anwendung läuft nur mit JDK Allgemeine Java-Themen 2
L Prog läuft in der IDE, hängt sich aber am Mac auf Allgemeine Java-Themen 0
M Code läuft unter windows aber nicht unter Linux Allgemeine Java-Themen 6
C Anwendung läuft nicht auf Mac OS X Allgemeine Java-Themen 2
D Programm läuft fehlerhaft, finde den Fehler nicht Allgemeine Java-Themen 6
X Applet läuft nicht, Applet in Webseite einbinden Allgemeine Java-Themen 4
A runnable jar läuft mur auf einem pc1 und nicht auf pc2 Allgemeine Java-Themen 6
R Thread läuft nicht?! Allgemeine Java-Themen 7
T Jar File läuft unter Windows aber nicht unter linux Allgemeine Java-Themen 10
B Methode läuft nicht unter UNIX Allgemeine Java-Themen 6
Bastie Selbstcompiliertes läuft nicht Allgemeine Java-Themen 8
W Java Applet läuft langsam Allgemeine Java-Themen 2
D Java läuft nicht richtig Allgemeine Java-Themen 12
D Api mit eine Methode die "immer" läuft bis "stop" "gerufen wird. Allgemeine Java-Themen 25
D Spielerwechsel über boolsche Werte läuft inkorrekt Allgemeine Java-Themen 6
F Eclipse JAVAMAIL läuft nur unter Eclipste Applet Viewer Allgemeine Java-Themen 4
C Programm das im Hintergrund läuft Allgemeine Java-Themen 2
N Scanner läuft nicht durch Allgemeine Java-Themen 2
T Gewährleisten das Applikation läuft!? Allgemeine Java-Themen 2
N Fehler abfang läuft doppelt durch Allgemeine Java-Themen 2
H Labels erstellen während Programm läuft Allgemeine Java-Themen 3
S Zeichen, dass Programm noch läuft Allgemeine Java-Themen 3
K [erledigt] JVM welche läuft Allgemeine Java-Themen 9
B Programm läuft unter Linux, aber nicht unter Windows Allgemeine Java-Themen 3
T Währungsrechner läuft nicht Allgemeine Java-Themen 11
V JAR-File läuft unter Windows und Linux, aber nicht unter OSX Allgemeine Java-Themen 6
J 2 Threads - aber nur einer läuft wirklich. Allgemeine Java-Themen 3
P läuft java 1.6 mit win me und 98 Allgemeine Java-Themen 4
G Läuft nicht unter Linux oO Allgemeine Java-Themen 10
M JVM Non-Heap läuft voll Allgemeine Java-Themen 4
L Java app läuft under win xp, automatisch auch unter vista32 Allgemeine Java-Themen 14
C externes Programm läuft erst nach schließen des mainprogramm Allgemeine Java-Themen 7
M Zeit läuft rückwärts Allgemeine Java-Themen 3
M Programm beendet - Thread läuft weiter Allgemeine Java-Themen 11
BFreakout Hilfe! Java Anwendung läuft nicht. Allgemeine Java-Themen 8
S Prozess javaw.exe läuft immer noch, obwohl Programm beendet Allgemeine Java-Themen 6
G überpüfen ob bereits instanz von java applikation läuft Allgemeine Java-Themen 4
I VM läuft nicht Allgemeine Java-Themen 2
C Enumeration läuft von hinten durch Allgemeine Java-Themen 4
S Mit javamail kompiliertes Programm läuft nicht ohne jar's Allgemeine Java-Themen 6
T Feststellen ob kein extra Thread läuft Allgemeine Java-Themen 10
I Wieso läuft Programm bei Kollegen aber nicht bei mir? Allgemeine Java-Themen 10
T Unterschied Dämon - Thread (läuft später auf RMI hinaus...) Allgemeine Java-Themen 6
Drachenbauer Wie sorge ich dafür, dass mein Spiel die ini-Datei in der Resourcen-ordner des Projektes schreibt? Allgemeine Java-Themen 5
I File ausführen und mein Programm bearbeiten lassen Allgemeine Java-Themen 11
M Brainstorming für mein Projekt Allgemeine Java-Themen 30
R Wo ist mein Fehler in der Methode DRINGEND Allgemeine Java-Themen 9
R Wo ist mein Fehler in diesem Code Allgemeine Java-Themen 7
M Suche aktuelle Apache Poi Bibliothek zum Einbinden in mein Programm Allgemeine Java-Themen 2
T log4j2 Wo liegt mein Logfile? Allgemeine Java-Themen 3
Thallius Warum läst mein replace die Klammern drin? Allgemeine Java-Themen 10
O Mein JButton Array funktioniert nicht Allgemeine Java-Themen 3
C Durch klicken von Button in GUI wird leeres Fenster geöffnet und nicht mein Spiel "Memory" Allgemeine Java-Themen 13
G Mein PDF Projekt mit iText Allgemeine Java-Themen 2
K Was ist mein Fehler? Allgemeine Java-Themen 2
Thallius App-Sprache in der App ändern. Wo ist mein Denkfehler? Allgemeine Java-Themen 6
M Mein erstes TicTacToe :-) Allgemeine Java-Themen 3
A Applet Mein Applet verursacht Browserabsturz Allgemeine Java-Themen 8
Ollek MVC - Anwendung auf mein Projekt Allgemeine Java-Themen 18
K Wo ist mein Fehler? Allgemeine Java-Themen 21
J Mein eigener Messenger und dessen Probleme Allgemeine Java-Themen 48
C Hilfe! Mein Java mag nich mehr ganz... Allgemeine Java-Themen 11
F VideoIntro für mein Programm Allgemeine Java-Themen 2
A Wie lasse ich mein Programm als Daemon laufen? Allgemeine Java-Themen 4
A Wie liefere ich mein Java-Programm richtig aus? Allgemeine Java-Themen 10
G Entscheidungsproblem für mein Vorhaben, zwischen Java und C# Allgemeine Java-Themen 35
G Wie kann ich in mein Programm eine Updatefunktion einbauen Allgemeine Java-Themen 3
E Wie bekomme ich mein Image in das Fenster Allgemeine Java-Themen 2
V Beratung zum Bestimmen der "Mittel"(Java,Sql) mein Allgemeine Java-Themen 3
S mit welchem befehl kann ich mein programm autom. schließen Allgemeine Java-Themen 3
M Bitte Testen: Mein Multi-File Editor Allgemeine Java-Themen 30
B Fehler:Mein Applet kann nicht auf zwei txt-Dateien zugreifen Allgemeine Java-Themen 2
C Warum wartet mein thread nicht? Allgemeine Java-Themen 2
F Datei auslesen - wo ist mein Fehler? Allgemeine Java-Themen 9
T Warum mein such-tool schneller als Windows such-tool? Allgemeine Java-Themen 5
A Wie mach ich, das mein Button schneller reagiert. Allgemeine Java-Themen 13
A mein Frame wird nicht schnell genung aktualisiert Allgemeine Java-Themen 7
G JFrame nimmt mein Image nicht Allgemeine Java-Themen 2
D Mein Bäumchen Allgemeine Java-Themen 6
S Programm entwickeln, welches ein Dreieckspuzzle lösen kann Allgemeine Java-Themen 5
R Lesen von Interfaces (Programm Vervollständigen) Allgemeine Java-Themen 10
Dann07 Java-Programm findet DLLs nicht! Allgemeine Java-Themen 20
OSchriever Linux-Programm öffnen Allgemeine Java-Themen 6
P USER Management in SQL übergreifend auf JAVA Programm Allgemeine Java-Themen 41
L Eclipse Konsole im exportierten Programm Allgemeine Java-Themen 2
OSchriever Programm über Linux-Kommandozeile ausführen Allgemeine Java-Themen 20
D Verkauf von einem Programm welches ich in Java geschrieben habe Allgemeine Java-Themen 4
M Programm erkennt String aus .txt Datei nicht Allgemeine Java-Themen 3
P Erstelltes Programm ist doppelt so groß Allgemeine Java-Themen 11
N Programm nach Abschluss neustarten lassen Allgemeine Java-Themen 6
S Einfaches Programm programmieren Allgemeine Java-Themen 5
M kleines KI Programm Idee Allgemeine Java-Themen 7
D Boolean von ein anderem Java Programm während der Laufzeit ändern Allgemeine Java-Themen 23

Ähnliche Java Themen

Anzeige

Neue Themen


Oben