kommunikation zwischen dialog und threads

Status
Nicht offen für weitere Antworten.

pymote

Aktives Mitglied
hallo zusammen,
ich habe ein grundlegende frage zur kommunikation zwischen dialogen und threads. z.b. habe ich ein programm mit einer spalte in der alle abläufe (threads, etc.) protokolliert werden soll. mehrere threads können vom benutzer gestarten und ggf. beendet werden.
bisher habe ich dazu am ende der thread-klasse die meldung (z.b. "thread1 wurde gestartet") dem protokoll-dialog übergeben.
Code:
display.asyncExec(new Runnable(){ 
			public void run() {
				dialog.listProtocol.add("thread1 gestartet");
		}});
dazu muss ich aber jedem thread das display (display) und das protokoll-gui-element (listProtocol) übergeben. rufe ich diesen thread z.b. über einen weiteren dialog auf (z.b. printThread über printDialog) muss ich auch beim erzeugen des printDialogs, das listProtocol des hauptdialogs übergeben, welches dann wiederum dem printThread übergeben wird.
was ich aber nicht haben will, ist eine solche verkettung von werteübergaben.
ist das ein falscher ansatz von mir?
gibt es eventuell design patterns die sich diesem problem annehmen?

vielen dank!
 
G

Guest

Gast
Es ist ein ganz normales Observer/Observable Szenario.
Lass das Dialogfenster den ganzen Display Part erledigen. Die Threads müssen
nichts von dem Dialog wissen und umgekehrt. Mit einem Singleton kannst Du
den Event-Austausch erledigen.
Code:
public class ThreadStateEvent extends TypedEvent
{
  Informationen über den Thread
}

public interface ThreadStateListener extends SWTEventListener
{
  public void threadStarted(ThreadStateEvent event);
  public void threadFinished(ThreadStateEvent event);
  // etc.
}

public class ThreadStateListenerSupport
{
  Als Singleton implementieren

  public void addThreadStateListener(ThreadStateListener listener)
  {
    ...
  }

  public void removeThreadStateListener(ThreadStateListener listener)
  {
    ...
  }

  public void fireThreadStarted(Object thread) // oder andere Parameter z.B. ThreadStateProvider siehe unten
  {
    ... hier ThreadStateEvent erzeugen und an alle Listener schicken (Dein Dialogfenster ist ein solcher Listener)
  }

  public void fireThreadFinished(Object thread) // oder andere Parameter z.B. ThreadStateProvider siehe unten
  {
    ... hier ThreadStateEvent erzeugen und an alle Listener schicken (Dein Dialogfenster ist ein solcher Listener)
  }
}


ThreadStateListenerSupport.getInstance().addThreadStateListener(deinDialog); // Im Konstruktor des Dialogs
ThreadStateListenerSupport.getInstance().removeThreadStateListener(deinDialog); // in dispose() des Dialogs

ThreadStateListenerSupport.getInstance().fireThreadStarted(this); // In deinen Threads
ThreadStateListenerSupport.getInstance().fireThreadFinished(this); // In deinen Threads
Deine Threads könnten noch ein Interface implementieren, das Methoden definiert,
über die der Listener sich die Informationen beschaffen kann.
z.B.
Code:
public interface ThreadStateProvider
{
  public String getThreadName();
  public int getThreadState();
  // etc.
}
 

pymote

Aktives Mitglied
ok, danke zunächst mal.
allerdings habe ich probleme (oder fehlendes verständnis) deine erklärung auf mein programm zu übertragen.
Was soll ich denn genau in dieser Methode implementieren?
Code:
public void addThreadStateListener(ThreadStateListener listener)
	{
	}

Und wie schicke ich ein ThreadStateEvent an meinen Dialog?
Bei diesem Versuch ....
Code:
public void fireThreadFinished(Object thread)
	{
		ThreadStateEvent tse = new ThreadStateEvent(thread);
		tse.notifyAll();
	}
bekomme ich folgenden Fehler:
Code:
java.lang.IllegalMonitorStateException: current thread not owner

ich hab mir mal ne andere erklärung für das observer pattern angesehen.

wenn ich es richtig verstanden habe,
- muss mein printThread die klasse observable erweitern.
- mein dialog mit der protokolliste implementiert die schnittstelle observer.
- dann weise ich meinem thread den observer (dialog) zu.
- beim ende des threads geb ich die nachricht mit der notify-methode an den dialog (z.b. printThread.addToList("Druckauftrag bearbeitet");

noch eine kleine anmerkung: mein printThread erbt ja bereits schon von 'Thread'? wie kann ich ihn dennoch als 'observable' implementieren

gruss pymote
 
G

Guest

Gast
Nein nichts mit Observer/Observable. Das habe ich nur als Beispiel genannt,
da es typisch für sowas ist.
Dein Dialog muss nur das Interface ThreadStateListener implementieren.
Deine Threads das Interface ThreadStateProvider.

Code:
public class ThreadStateListenerSupport
{
  private static ThreadStateListenerSupport instance=null;
  private List listenerList = new ArrayList();

  private ThreadStateListenerSupport()
  {
  }

  public static ThreadStateListenerSupport getInstance()
  {
    if(instance == null)
      instance = new ThreadStateListenerSupport();

    return instance;
  }

  public void addThreadStateListener(ThreadStateListener listener)
  {
    if(!listenerList.contains(listener))
      listenerList.add(listener);
  }

  public void removeThreadStateListener(ThreadStateListener listener)
  {
    listenerList.remove(listener);
  }

  public void fireThreadStarted(ThreadStateProvider thread)
  {
    ThreadStateEvent event = new ThreadStateEvent(thread);
    for(ThreadStateListener listener : listenerList)
      listener.threadStarted(event);
  }

  public void fireThreadFinished(ThreadStateProvider thread)
  {
    ThreadStateEvent event = new ThreadStateEvent(thread);
    for(ThreadStateListener listener : listenerList)
      listener.threadFinished(event);
  }
}
Rest, wie in meiner ersten Antwort beschrieben.
 

pymote

Aktives Mitglied
Dank dir, jetzt hats funktioniert. alles was ich noch beachten musste, war dass ich nicht vergesse das beschreiben der protokolliste in einer runnable-umgebung ablaufen zu lassen:

Code:
public void threadFinished(ThreadStateEvent event) {
		display.asyncExec(new Runnable(){
			public void run() {
				listProtocol.add("Thread1 beendet");				
			} 
		});		
	}

gruss pymote
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
CptK Backpropagation parallelisieren: Kommunikation zwischen den Threads Allgemeine Java-Themen 7
L Kommunikation zwischen C# und Java? Allgemeine Java-Themen 5
S Threads Kommunikation zwischen SocketThread und WorkerThread Allgemeine Java-Themen 11
A Kommunikation zwischen 2 Jar-dateien Allgemeine Java-Themen 16
E kommunikation zwischen Fenstern Allgemeine Java-Themen 3
A Kommunikation zwischen C++ und Java-Programm Allgemeine Java-Themen 4
M Kommunikation zwischen 2 Programmen Allgemeine Java-Themen 7
G Kommunikation zwischen Threads und Gui Allgemeine Java-Themen 2
V Kommunikation zwischen Programmen und Threads Allgemeine Java-Themen 7
R PIPE Kommunikation mit Prozess blockiert Allgemeine Java-Themen 0
M Checksummenprüfung bei Client Server kommunikation Allgemeine Java-Themen 3
D Interthread-Kommunikation Allgemeine Java-Themen 6
0 Lösungsweg Client Server Kommunikation Fehlermeldung ausgeben Allgemeine Java-Themen 12
L Software-Design: Kommunikation mit SerialPort (RXTX) Allgemeine Java-Themen 2
F Serielle Kommunikation Allgemeine Java-Themen 20
S Kommunikation von Core und GUI über Schnittstellen Allgemeine Java-Themen 2
P Komponenten kommunikation Allgemeine Java-Themen 7
L Serielle Kommunikation Allgemeine Java-Themen 6
G Implementierung einer Kommunikation Allgemeine Java-Themen 7
B SerialPort Kommunikation - Pufferüberlauf Allgemeine Java-Themen 6
0 Sandbox und Applet Kommunikation Allgemeine Java-Themen 9
H Java C++ Interprozess Kommunikation Allgemeine Java-Themen 7
D Klassen Kommunikation Allgemeine Java-Themen 11
M Applet Servlet Kommunikation ein Problem bei externem Server Allgemeine Java-Themen 3
F Kommunikation zw 2 Java-Programmen mit unterschiedl Compiler Allgemeine Java-Themen 13
G Kommunikation mit Remotegeräten Allgemeine Java-Themen 2
J Kommunikation mit USB Gerät, das Midi-Signale sendet Allgemeine Java-Themen 4
G Kommunikation mit der seriellen Schnittstelle Allgemeine Java-Themen 6
H Kommunikation mit einem c-Prozess funzt nicht richtig Allgemeine Java-Themen 5
C Pattern für Kommunikation gesucht Allgemeine Java-Themen 3
B Kommunikation mit entferntem Thread Allgemeine Java-Themen 6
O kommunikation zw. objekten Allgemeine Java-Themen 7
G Kommunikation von zwei Java-Programmen Allgemeine Java-Themen 3
N Inter-Thread-Kommunikation Allgemeine Java-Themen 3
M Kommunikation mit externem Programm ueber Linux-Pipes Allgemeine Java-Themen 4
T Kommunikation mit batch datei Allgemeine Java-Themen 3
K MVC - Kommunikation Controller <> Gui Allgemeine Java-Themen 5
P Kommunikation von Threads Allgemeine Java-Themen 5
H Servlet/Applet Kommunikation Allgemeine Java-Themen 2
C Kommunikation mit USB Port Allgemeine Java-Themen 1
O Text aus einer Textdatei rausholen, der zwischen zwei Schlüsselworten steht Allgemeine Java-Themen 4
B Sent and Receive Funktionen zwischen Objekten ermöglichen? Allgemeine Java-Themen 8
Master3000 Dateien zwischen verschiedenen Netzwerken senden Allgemeine Java-Themen 17
L Unterschied zwischen List und LinkedList implementierung? Allgemeine Java-Themen 15
B Schnittstelle zwischen MySQL und Apache Allgemeine Java-Themen 8
TonioTec Api für Datenaustausch zwischen Client und Server Allgemeine Java-Themen 0
Kirby.exe Schauen ob ein Kante zwischen Knoten existiert Allgemeine Java-Themen 4
L Schlüsselworte Wie kann ich am Besten ein LocalDate zwischen Anfangs und EndDate checken Allgemeine Java-Themen 10
Zrebna Random Number - Generische Formel zwischen zwei INKLUSIVEN Werten Allgemeine Java-Themen 16
N Kollision zwischen ImageIcon und Rechteck Allgemeine Java-Themen 1
D Input/Output Zwischen zwei ID-Räumen unterscheiden und Objekt löschen Allgemeine Java-Themen 16
B Zufällig zwischen vorgegebenen Zahlen auswählen Allgemeine Java-Themen 6
J Millisekunde zwischen 2 Daten Allgemeine Java-Themen 6
D Best Practice Die niedrigste Differenz zwischen zwei Listen ermitteln. Allgemeine Java-Themen 10
J Fahrroute zwischen zwei Punkten finden Allgemeine Java-Themen 1
J Transfer von Integer zwischen zwei Clients - RMI Allgemeine Java-Themen 4
F Unterschied zwischen NormalizedValue und Value Allgemeine Java-Themen 5
G Liste zwischen zwei Kalenderdaten erstellen Allgemeine Java-Themen 3
J Abhängigkeit zwischen Rechenzeit und Speicherbedarf in einen Algorithmus Allgemeine Java-Themen 7
T Strings über Bluetooth zwischen PC,µc oder Samrtphone senden und empfangen Allgemeine Java-Themen 0
H RegularExpression zwischen zwei Strings Allgemeine Java-Themen 2
V Input/Output Austausch von Bytes zwischen C# und Java Allgemeine Java-Themen 3
A Best Practice Unterschied zwischen einer sauberen Dependency Injection und einer statischen Klasse Allgemeine Java-Themen 5
R jTable, nur Werte zwischen 2 Double values ausgeben Allgemeine Java-Themen 3
J Wie erschaffe ich einen sicheren Datenaustausch zwischen Thread und Nicht-Threads Allgemeine Java-Themen 8
M Unterschied zwischen Win 7/2008R2 und Win8.1/2012R2? Allgemeine Java-Themen 8
N Zeitabstand zwischen 2 Daten(Mehrzahl von Datum) Allgemeine Java-Themen 3
O Socket-Unterschiede zwischen Windows und Ubuntu Allgemeine Java-Themen 2
Z Vergleich zwischen int und Object Allgemeine Java-Themen 1
H Gibt es einen großen Unterschied zwischen Java 6 und Java 7? Allgemeine Java-Themen 3
S Eclipse Abhängigkeiten zwischen den Projekten in Eclipse Allgemeine Java-Themen 2
G nervendes Problem mit unterschieden zwischen Javax64 und x86 | je nach Programmbedarf beides nötig Allgemeine Java-Themen 2
J Java-Implementierung diverser Beziehungen zwischen Klassen bzw. Objekten Allgemeine Java-Themen 2
B Unteschiede zwischen Kantenoperatoren Allgemeine Java-Themen 3
X Datentypen Prozentualer Abgleich zwischen 2 Strings (Pattern?) Allgemeine Java-Themen 3
Z zeit zwischen maus drücken und loslassen Allgemeine Java-Themen 7
C Komisches Verhalten zwischen Set und List bei contains Allgemeine Java-Themen 6
K Objekt-Austausch zwischen zwei Programmen über System-Clipboard Allgemeine Java-Themen 5
N Gridbaglayout - Abstände zwischen Komponenten einstellen Allgemeine Java-Themen 2
H Datenaustausch zwischen zwei Java-Programmen Allgemeine Java-Themen 5
D Exakte Unterschied zwischen diesen Elementen? Allgemeine Java-Themen 5
C Swing Daten zwischen JTable teilen Allgemeine Java-Themen 6
N Unterschied zwischen "Java" und "Java mit Eclipse" Allgemeine Java-Themen 17
X Bild im Memory zwischen speichern Allgemeine Java-Themen 11
T Zugriff zwischen Klassen für repaint Allgemeine Java-Themen 7
S Assoziation zwischen 2 klassen Allgemeine Java-Themen 14
V Threads & Pipes Datenaustausch zwischen Threads Allgemeine Java-Themen 2
G Hauptthread anhalten / Unterschied zwischen Main-Thread und dialogelement-Thread Allgemeine Java-Themen 2
C Strings zwischen 2 Zeichen auslesen Allgemeine Java-Themen 7
Lufti Unterschied zwischen Djava.library.path und Class-Path im Manifest? Allgemeine Java-Themen 2
A Differenz zwischen zwei Uhrzeiten Allgemeine Java-Themen 7
B Unterschied zwischen Klasse und Objekt? Allgemeine Java-Themen 8
S Datenformat zum Austausch zwischen Java und Python? Allgemeine Java-Themen 3
G Interface zwischen 2 Programmierern Allgemeine Java-Themen 10
B Gibt es einen Unterschied zwischen Java 1.2 und Java 2? Allgemeine Java-Themen 7
J Unterschied zwischen "Debug" und "Run" Allgemeine Java-Themen 16
A java.io-Änderungen zwischen java 1.4 und 1.6 Allgemeine Java-Themen 18
G Zwischen Datei und Verzeichnis unterscheiden. Allgemeine Java-Themen 11
J Unterschiede zwischen normaler und Debug Ausfuehrung? Allgemeine Java-Themen 2
G Linked List zwischen zwei Threds übergeben Allgemeine Java-Themen 11

Ähnliche Java Themen

Neue Themen


Oben