# GUI friert ein



## Vintner (5. Nov 2011)

Hallo,

ich arbeite an einem Programm, das über den Modbus (verwende die jamod-Bib dafür) Daten aus einer SPS ausliest. 
Dabei wird eine feste TCP-Verbindung aufgebaut. Die Klasse (ModCon genannt) dafür erbt von Thread, damit ich in einer Endlosschleife den Thread nach jedem Durchlauf beliebig lang pausieren lassen kann. 
Um die Daten grafisch darzustellen habe ich eine GUI Programmiert die IP-Adresse und Port an ModCon schickt.
Beide Objekte haben ihren eigenen Thread, die GUI implementiert Runnable da sie schon von JFrame erbt.
Wenn das GUI Objekt die Daten losgeschickt hat und mein ModCon-Objekt die Verbindung aufbaut friert die GUI derweil ein. Ich weiß nicht genau warum, da ja beide Klassen ihren eigenen Thread haben.

Falls ihr noch mehr Informationen braucht poste ich die gerne.

Viele Grüße


----------



## XHelp (5. Nov 2011)

Den Teil mit "GUI implementiert Runnable" habe ich  zwar nicht verstanden, aber:
So ganz ohne Code lässt sich nur sagen: es läuft eben was schief.
Wenn du das ganze so gut es geht kürzt und hier postest, könnte man vlt etwas mehr sagen.


----------



## ARadauer (5. Nov 2011)

Startest du den Thread auch richtig?



> die GUI implementiert Runnable da sie schon von JFrame erbt


zeig das mal

Wenn die Logik (egal was es ist) die vom edt aufgerufen wird länger dauert und einem thread läuft, dürfte die gui nicht einfrieren...

Event dispatching thread - Wikipedia, the free encyclopedia


----------



## Vintner (5. Nov 2011)

Die GUI implementiert eig. Runnable damit sie unabhängig in einem eigenen Thread läuft, um zu verhindern dass sie einfriert ... dachte ich mir.

Hier mal etwas Code (geschnitten):

Main:


```
public class WetterMain{

	//Modbus Connection anlegen und in einen Thread packen
	static Thread mbc = new ModbusConnection();
	
	public static void main (String[] args){
		/*
		 * GUI erzeugen
		 */
		Visualisierung gui = new Visualisierung((GUIListener)mbc); //erzeugt die GUI
		(Runnable) gui.run();	//startet die GUI
		
		gui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		gui.pack();
        gui.setVisible(true);
		gui.setSize(800, 600);
		
		mbc.addModbusListener((ModbusListener)gui);	//GUI der Connection als Listener übergeben
		
	}
}//WetterMain
```

Den Rest kann ich auch gerne kürzen und hochladen, aber dauert dann etwas länger


----------



## ARadauer (5. Nov 2011)

> Runnable damit sie unabhängig in einem eigenen Thread läuft, um zu verhindern dass sie einfriert ... dachte ich mir.


Das macht die GUI sowieos. Man nennt das den EventDispatcherThread. Wenn du jetzt etwas machst, zb ModbusConnection in einem Listener aufrufst musst du das in einem neuen Thread starten..

(Runnable) gui.run();  das ist auch nicht richtig.. einen Thread startet man nicht mit run... sondern mit start und dann wird intern die run Methode benutzt: Galileo Computing :: Java ist auch eine Insel - 12 Einführung in die nebenläufige Programmierung Ich glaube das ist das eigentliche Problem, dass deine Threads nicht als Thread laufen..


----------



## Vintner (5. Nov 2011)

Ah, danke. Dann schau ich gleich nochmal nach. Allerdsings funktioniert Thread.sleep() in den Threads ... von daher dachte ich dass sie funktionieren würden ...


----------



## Vintner (5. Nov 2011)

Ich habe jetzt den Thread für die GUI aufgehoben und die ModbusConnection über mbc.start() gestartet ... das klappt und die GUI friert nicht ein. 

Vielen Dank


----------

