Ein Thread soll ein Textfeld (SWT) ändern

Status
Nicht offen für weitere Antworten.

MrLinux

Mitglied
Hallo zusammen,

ich bräuchte von euch mal einen Gedankenanstoß!

Ich versuche gerade mit einem zweiten Thread eine Textfeld (SWT) zu ändern.
Dazu habe ich folgendes zusammen geschrieben.

Code:
package gui;

import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Button;
import src.SensorThread;

public class JWatcher {

	private Shell sShell = null;
	public Text text = null;
	private Button button = null;
	public String temp = "a";
	
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Automatisch erstellter Methoden-Stub
		/* Before this is run, be sure to set up the launch configuration (Arguments->VM Arguments)
		 * for the correct SWT library path in order to run with the SWT dlls. 
		 * The dlls are located in the SWT plugin jar.  
		 * For example, on Windows the Eclipse SWT 3.1 plugin jar is:
		 *       installation_directory\plugins\org.eclipse.swt.win32_3.1.0.jar
		 */
		Display display = Display.getDefault();
		JWatcher thisClass = new JWatcher();
		thisClass.createSShell();
		thisClass.sShell.open();

		while (!thisClass.sShell.isDisposed()) {
			if (!display.readAndDispatch())
				display.sleep();
		}
		display.dispose();
	}

	/**
	 * This method initializes sShell
	 */
	private void createSShell() {
		sShell = new Shell();
		sShell.setText("JWatcher");
		sShell.setSize(new Point(300, 200));
		text = new Text(sShell, SWT.BORDER);
		text.setBounds(new org.eclipse.swt.graphics.Rectangle(55,64,51,19));
		button = new Button(sShell, SWT.NONE);
		button.setBounds(new org.eclipse.swt.graphics.Rectangle(139,111,96,30));
		button.setText("Temperatur");
		button.addMouseListener(new org.eclipse.swt.events.MouseAdapter() {
			public void mouseDown(org.eclipse.swt.events.MouseEvent e) {
				System.out.println("mouseDown()"); // TODO Auto-generated Event stub mouseDown()
				test();
			}
		});
	}
	
	public void test() {
		Thread t = new SensorThread();
		t.start();
	}

}

Ich weiß nicht schön aber zum üben ausreichend.

Der Thread sieht so aus.

Code:
package src;

import java.io.InputStreamReader;
import java.io.BufferedReader;

import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.MessageBox;
import org.eclipse.swt.widgets.Shell;

import gui.JWatcher;

public class SensorThread extends Thread {
	static String temperatur = "";
	String line = "";
	
	public void run(){
		int a = 0;
		while (true) {
			System.out.println("Hallo zum :" + a++);
		
			try
			{
			Process proc = Runtime.getRuntime().exec("cat /proc/acpi/thermal_zone/TZ1/temperature");
			BufferedReader input = new BufferedReader(new InputStreamReader(proc.getInputStream()));	
					
			line = input.readLine();
			
			//input.close();
			}
			catch (Exception k) { System.err.println(""+k); }

			System.out.println("Hallo zum :" + line);
			
			// Den Thread für 5 sec anhalten
			try {
				Thread.sleep(5000);
				}
				catch (InterruptedException e) {}
		}
	}
	
}

Das ganze läuft so weit, die Ausgabe auf der Konsole funktioniert.
Aber wie kann ich nun den String "line" aus dem Thread in das Textfeld auf der sShell schreiben?
Ich habe gesetern mal mit PipedInputStream und PipedOutputStream rum probiert aber ohne Erfolg.

Habe schon versucht das Beispiel unter http://www.java-forum.org/de/viewtopic.php?p=139877#139877 an zu passen. Beim verusch in das Textfeld zu schreiben bekomme ich immer eine Fehlermeldung "ungültiger Thread zugriff"

Ziel des ganzen soll sein das Texfeld alle 5 sec. mit der aktuellen Prozessortemperatur zu überschreiben.

Wie muss ich in einem solchen Fall vorgehen?


Gruß
JB
 

KSG9|sebastian

Top Contributor
also, zuerst mal ein Runnable welches die Änderungen vornimmt:

Code:
final Runnable r = new Runnable() {
    public void run() {
        textFeld.setText("xyz");	
    }
};

Dann brauchst du den eigentlichen Thread:

Code:
Thread thr = new Thread(new Runnable() {
			public void run() {
				while (true) {
					Display.getDefault().syncExec(r);
				}
			}
		});
		thr.start();

So, also:

der Threead (thr) läuft endlos. In dem kannst du NICHT auf die GUI zugreifen. Mit "Display.getDefault.syncExec" kannst du ein anderes Runnable ausführen welches auf die GUI zugreifen darf.
 

MrLinux

Mitglied
Hallo,

habe es eben mal ausprobiert.
Es funktioniert einwandfrei ! Wieder mal was gelernt.

Anbei der Code der unter Suse 10 läuft.

Code:
package gui;



import java.io.BufferedReader;

import java.io.InputStreamReader;

import org.eclipse.swt.graphics.Point;

import org.eclipse.swt.widgets.Shell;

import org.eclipse.swt.widgets.Display;

import org.eclipse.swt.widgets.Text;

import org.eclipse.swt.SWT;

import org.eclipse.swt.widgets.Button;





public class JWatcher {



	private Shell sShell = null;

	public Text text = null;

	private Button button = null;

	String line = "";

	

	/**

	 * @param args

	 */

	public static void main(String[] args) {

		// TODO Automatisch erstellter Methoden-Stub

		/* Before this is run, be sure to set up the launch configuration (Arguments->VM Arguments)

		 * for the correct SWT library path in order to run with the SWT dlls. 

		 * The dlls are located in the SWT plugin jar.  

		 * For example, on Windows the Eclipse SWT 3.1 plugin jar is:

		 *       installation_directory\plugins\org.eclipse.swt.win32_3.1.0.jar

		 */

		Display display = Display.getDefault();

		JWatcher thisClass = new JWatcher();

		thisClass.createSShell();

		thisClass.sShell.open();



		while (!thisClass.sShell.isDisposed()) {

			if (!display.readAndDispatch())

				display.sleep();

		}

		display.dispose();

	}



	/**

	 * This method initializes sShell

	 */

	private void createSShell() {

		sShell = new Shell();

		sShell.setText("JWatcher");

		sShell.setSize(new Point(300, 200));

		sShell.addShellListener(new org.eclipse.swt.events.ShellAdapter() {

			public void shellClosed(org.eclipse.swt.events.ShellEvent e) {

				//

			}

		});

		text = new Text(sShell, SWT.BORDER);

		text.setBounds(new org.eclipse.swt.graphics.Rectangle(11,64,270,19));

		button = new Button(sShell, SWT.NONE);

		button.setBounds(new org.eclipse.swt.graphics.Rectangle(85,96,96,30));

		button.setText("Temperatur");

		button.addMouseListener(new org.eclipse.swt.events.MouseAdapter() {

			public void mouseDown(org.eclipse.swt.events.MouseEvent e) {

				System.out.println("mouseDown()"); // Für die Entwicklung

				test();

			}

		});

	}

	

	// Methode die den Thread erzeugt

	public void test() {

		Thread thr = new Thread(new Runnable() { 

	         public void run() { 

	            while (true) { 

	            	Display.getDefault().syncExec(r); 

	            	// Den Thread für 2 sec anhalten

	            	try {

	            		Thread.sleep(2000);

	   				}

	   				catch (InterruptedException e) {}

	            } 

	         } 

	     }); 

	    // Thread starten 

		thr.start(); 

	}

	

	// Runnable das das Textfeld ändern kann

	final Runnable r = new Runnable() { 

	    public void run() { 

			try {

				Process proc = Runtime.getRuntime().exec("cat /proc/acpi/thermal_zone/TZ1/temperature");

				BufferedReader input = new BufferedReader(new InputStreamReader(proc.getInputStream()));	

				// Die Temperatur in einen String schreiben	

				line = input.readLine();

				// und die Temperatur in das Textfeld schreiben

				text.setText(line);

			}

			catch (Exception k) { System.err.println(""+k); }

	    } 

	}; 

}

Jetzt muss ich nur noch raus bekommen wie ich den Thread beende.

Also Danke
 

Leroy42

Top Contributor
Am besten beendet er sich selbst auf Anforderung
Code:
           private boolean stopThisThread = false:
           public void run() { 

               while (!stopThisThread) { 

                  Display.getDefault().syncExec(r); 

                  // Den Thread für 2 sec anhalten 

                  try { 

                     Thread.sleep(2000); 

                  } 

                  catch (InterruptedException e) {} 

               } 

            }
Und von außerhalb setzt du stopThisThread einfach auf true
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Threads ServerSocket-Thread soll schlafen, bis er gebraucht wird Allgemeine Java-Themen 2
J Main-Thread soll auf alleKinder Threads warten Allgemeine Java-Themen 5
B Thread soll anderen Thread beenden Allgemeine Java-Themen 5
A NullPointerException, Thread soll Thread steuern Allgemeine Java-Themen 2
B Thread soll auf Event warten, dann Daten an Klasse senden Allgemeine Java-Themen 2
R Thread soll auf MouseClick warten Allgemeine Java-Themen 2
R 11 GB File lesen ohne zu extrahieren Filedaten Bereich für Bereich adressieren dann mit Multi-Thread id die DB importieren Allgemeine Java-Themen 3
urmelausdemeis Exception in thread "main" java.lang.Error: Unresolved compilation problem: Allgemeine Java-Themen 7
smarterToby Wie stoppe ich diesen Thread Allgemeine Java-Themen 4
A Thread.sleep Problem Allgemeine Java-Themen 2
J Thread started nur einmal Allgemeine Java-Themen 19
W Server-Thread schreibt nicht alle Dateien Allgemeine Java-Themen 6
OnDemand Logfile pro User / Thread Allgemeine Java-Themen 7
OnDemand Thread / Service abbrechen Allgemeine Java-Themen 3
Thallius Ist meine static Helper Class Thread save? Allgemeine Java-Themen 9
P Swing Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: npoints > xpoints.length || npoints > ypoints.length Allgemeine Java-Themen 5
B Thread.sleep() in EJB Container wie lösen? Allgemeine Java-Themen 11
S Ist das Neuzuweisen von Feldern atomic und damit Thread-Safe? Allgemeine Java-Themen 2
S Exception in thread "main" java.lang.NullPointerException at FamilienApp.main(FamilienApp.java:15) Allgemeine Java-Themen 1
J Einen Thread in einer Schleife Allgemeine Java-Themen 2
E HILFE !! Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/io/FileUtils Allgemeine Java-Themen 4
Flynn Thread-Problem... Allgemeine Java-Themen 2
G Thread-Programmierung Allgemeine Java-Themen 5
S Datei wird nicht gefunden Thread.currentThread().getContextClassLoader().getResourceAsStream() Allgemeine Java-Themen 1
G Beendet sich der Thread selbst?! Allgemeine Java-Themen 3
mrbig2017 Sleep wird ignoriert und der Thread wartet nicht Allgemeine Java-Themen 1
S Thread beenden Allgemeine Java-Themen 9
M Array aus Thread Objekten erstellen Allgemeine Java-Themen 2
Aruetiise Swing JOptionPane ohne denn Thread zu pausieren Allgemeine Java-Themen 1
M Nanosekunden-Pause innerhalb einen Thread-Loops Allgemeine Java-Themen 3
E Thread Exception Allgemeine Java-Themen 6
javaerd Binomialkoeffizient ausrechnen, Exception in thread "main" java.lang.StackOverflowError Allgemeine Java-Themen 6
T Merkwürdiges Thread-Verhalten Allgemeine Java-Themen 6
K Thread Problem Allgemeine Java-Themen 6
W Thread sleep 30 sekunden - wenn keine Antwort bis dahin neu senden Allgemeine Java-Themen 2
H Thread bleibt stehen bei jar in jar Allgemeine Java-Themen 1
J Threads HTTP Request (Thread) dauert lange - in Android Allgemeine Java-Themen 3
F CPU Last eines Thread ausfindig machen Allgemeine Java-Themen 0
V Compiler-Fehler Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: Index: 125, Size: 125 Allgemeine Java-Themen 11
Tausendsassa Threads Einen Thread sich selbst schließen lassen Allgemeine Java-Themen 17
P Threads BufferedImage, Thread Concurrency Allgemeine Java-Themen 1
M Klasse in separaten Thread ausführen.Wie genau? Allgemeine Java-Themen 2
llabusch Thread blockiert Dialog Allgemeine Java-Themen 1
J Thread wait() Allgemeine Java-Themen 2
V Thread.sleep und InterruptedException? Allgemeine Java-Themen 1
G Thread nicht von GC zerstört Allgemeine Java-Themen 6
J Wie erschaffe ich einen sicheren Datenaustausch zwischen Thread und Nicht-Threads Allgemeine Java-Themen 8
Sogomn Thread blocken bis Taste gedrückt Allgemeine Java-Themen 5
T Starten vom Thread Allgemeine Java-Themen 3
T Wait/Notify() bei Thread Allgemeine Java-Themen 6
J Exception in thread "main" java.lang.NoClassDefFoundError Allgemeine Java-Themen 4
M Exception in thread "AWT-EventQueue-0" Allgemeine Java-Themen 6
Q Thread wacht nicht auf Allgemeine Java-Themen 7
T Fragen zum Thread-Thema Allgemeine Java-Themen 4
T Threads Input/Output im Thread - Datei ohne Inhalt Allgemeine Java-Themen 1
T Fragen zum Thread-Thema Allgemeine Java-Themen 9
C Threads Variablen in einem Thread Aktualisieren Allgemeine Java-Themen 17
U Thread beenden Allgemeine Java-Themen 3
W Threads Mit Thread und Runtime externe Programme öffnen Allgemeine Java-Themen 0
N Thread interrupt Status debuggen Allgemeine Java-Themen 6
A Thread: Code paralell ausführen in mehreren Instanzen Allgemeine Java-Themen 1
E Threads linkedlist/multi-thread problem Allgemeine Java-Themen 3
B Erkennen, wann Prozess beendet ist, dann Thread beenden. Allgemeine Java-Themen 6
A Thread Fehler absichtlich provozieren Allgemeine Java-Themen 3
B Threads Java Thread kommunizieren Allgemeine Java-Themen 12
N Thread Sicherheit im komplexen Datenmodell Allgemeine Java-Themen 7
K Thread richtig benutzen Allgemeine Java-Themen 3
K Exception in thread "AWT-EventQueue-1" Allgemeine Java-Themen 2
vandread Problem bei kleiner Thread-Übung Allgemeine Java-Themen 2
G Thread erzeugt nicht plausible NullPointerException Allgemeine Java-Themen 7
H Netbeans Warning bei Thread.sleep in Schleife Allgemeine Java-Themen 4
P [Thread] Scheint nicht Sequenziell zu Arbeiten Allgemeine Java-Themen 9
A eine test thread.join() frage Allgemeine Java-Themen 2
tuttle64 Verständnisprobleme mit Thread Locks Allgemeine Java-Themen 4
G Threads Thread bei Datenabfrage Allgemeine Java-Themen 3
S Thread anhalten per Button ? Allgemeine Java-Themen 3
E Thread Programmierung Allgemeine Java-Themen 2
V Thread schneller stoppen Allgemeine Java-Themen 2
V anstatt thread.join() einfach while schleife? Allgemeine Java-Themen 8
B Mausbewegung im Thread erkennen (hoch/runter) Allgemeine Java-Themen 6
G Linux/C++/Pthreads auf JVM zugreifen, thread safe? Allgemeine Java-Themen 10
K Threads Probleme mit Thread Allgemeine Java-Themen 13
K Threads Thread überprüfen Allgemeine Java-Themen 3
Z Threads Thread für einen Client Allgemeine Java-Themen 9
M Thread JavaFish Allgemeine Java-Themen 10
G Thread.sleep Allgemeine Java-Themen 12
M Threads Viele Aufrufe aus Thread, komisches Verhalten Allgemeine Java-Themen 8
B Threads Main Thread warten auf abgebrochen Task warten lassen Allgemeine Java-Themen 25
K Timer Thread Allgemeine Java-Themen 8
M Methoden Static Methoden und Thread??? Allgemeine Java-Themen 4
N java.lang.IllegalMonitorStateException: object not locked by thread before notify() Allgemeine Java-Themen 2
C Mehothode in anderenm Thread aufrufen Allgemeine Java-Themen 10
R Thread läuft nicht?! Allgemeine Java-Themen 7
R ThreadPool - vorhandene thread liste überprüfen bzw. aufräumen Allgemeine Java-Themen 3
J Anderem Thread Variable mitgeben Allgemeine Java-Themen 2
C Argument an einen Thread übergeben Allgemeine Java-Themen 4
S java.util.ConcurrentModificationException - aber nur ein Thread Allgemeine Java-Themen 3
G JUnit Test Methoden in anderen Thread verlagern Allgemeine Java-Themen 4
P Java Probleme - java.lang.Thread.run(Unkown Source) Allgemeine Java-Themen 10
L Im Thread auf Eingaben warten Allgemeine Java-Themen 3

Ähnliche Java Themen

Neue Themen


Oben