Problem mit sleep

papapete

Mitglied
Hallo Leute,

bin neu hier und versuche mich in JAVA. Habe ein USB-Experimentierinterface und möchte eine Oberfläche in Java schreiben. Soweit alles gut geklappt, ich kann die IO's einlesen bzw. beschreiben.
Nun möchte ich folgendes realisieren:
Wenn ich einen Button drücke, soll das Programm 10 sec. warten. In dieser Zeit soll es aber den Analogeingang ständig einlesen und den Wert in einem Feld Anzeigen. Erst wenn die Zeit um ist, soll der Wert auch "einfrieren". Wenn ich sleep verwende friert mir aber der gesamte Thread ein und nach den 10 sec. wird der Wert ausgelesen und geschrieben. Habe mal ein Bsp. dazu geschrieben.

T1 ist die Klasse wo das Interface angesprochen wird.

Java:
import javax.swing.*;
import java.awt.*;

import java.awt.event.*;

public class test extends javax.swing.JFrame
{
    private JButton button1;
    private JPanel panelButton;
    private JLabel anzeige;
    public T1 jv= new T1();

    public test()
    {
        super("Fenster");
        setLocation(300,300);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        getContentPane().setLayout(new BorderLayout(5,5));
        button1 = new JButton("Button 1");
        panelButton = new JPanel(new GridLayout(3,1));
        panelButton.add(button1);
        addButtonListener(button1);
        anzeige = new JLabel("Button klicken");
        getContentPane().add(anzeige);
        getContentPane().add(BorderLayout.WEST, panelButton);
        pack();
        setVisible(true);

    }

    public static void main(String[] args)
    {
        test g = new test();
    }

    private void addButtonListener(JButton b)
    {
        b.addActionListener(new ActionListener() 
        { 
            public void actionPerformed(ActionEvent ae) 
            { 
                messung();
            }
        });
    }

    private void messung()
    {
      jv.OpenDevice(0);
      try {
      Thread.sleep(1000);
      anzeige.setText(String.valueOf(jv.ReadAnalogChannel(2)));
      jv.OutputAnalogChannel(2, jv.ReadAnalogChannel(2));
      jv.CloseDevice();
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
    
    }    
}

Kann mir da evtl. jemand weiterhelfen?

Danke schon mal im Voraus
 
G

Gast2

Gast
Du rufst sleep() auf dem EDT aus, das führt dann dazu dass dein ganzes Programm einfriert. Solche IO Sachen musst du in nem eigenen Thread ausführen.
 

papapete

Mitglied
Habe ich auch schon versucht. Hatte nur den Erfolg, dass

Java:
jv.OutputAnalogChannel(2, jv.ReadAnalogChannel(2));

auf dem Interface funtioniert hat, die Werte aber nicht im Textfeld angezeigt wurden.
 

papapete

Mitglied
Ich versteh nicht ganz wie ich die Treads organisieren soll.

Das Interface-Objekt T1 soll ja nicht in den "Schlafmodus", soweit kein Problem. Das Hauptfenster aber auch nicht, da während der Wartezeit die Werte des Analogeingangs angezeigt werden sollen.
 

papapete

Mitglied
Ok... habs jetzt mal so umgebaut. Keine Ahnung ob es "elegant" ist aber es funktioniert zumindest teilweise.

Java:
import javax.swing.*;
import java.awt.*;

import java.awt.event.*;

public class test extends JFrame
{
    private JButton button1;
    private JPanel panelButton;
    private JLabel anzeige;
    private JLabel zeit;
    public T1 jv= new T1();
    public Thread th1;
    public Thread th2;
    

    public test()
    {
        super("Fenster");
        setLocation(300,300);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        getContentPane().setLayout(new BorderLayout(5,5));
        button1 = new JButton("Button 1");
        panelButton = new JPanel(new GridLayout(3,1));
        panelButton.add(button1);
        addButtonListener(button1);
        anzeige = new JLabel("Button klicken");
        zeit = new JLabel("Zeit");
        getContentPane().add(zeit);
        getContentPane().add(anzeige);
        getContentPane().add(BorderLayout.WEST, panelButton);
        pack();
        setVisible(true);

    }

    public static void main(String[] args)
    {
        test g = new test();
    }

    private void addButtonListener(JButton b)
    {
        b.addActionListener(new ActionListener() 
        { 
            public void actionPerformed(ActionEvent ae) 
            { 
                messung();
            }
        });
    }
    public class c2 implements Runnable{
      public void run(){
        for (int i = 0; i < 10; i++) {
      try {
        Thread.sleep(1000);
        anzeige.setText(String.valueOf(i)+" sec");
        
      } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
      } 
      }
        jv.CloseDevice();
        th1.interrupt();
        th2.interrupt();
      }
    }
    
    public class c1 implements Runnable{
      public void run(){
        jv.OpenDevice(0);
        while (true){
          //anzeige.setText(String.valueOf(jv.ReadAnalogChannel(2)));
          jv.OutputAnalogChannel(2, jv.ReadAnalogChannel(2));
        }
      }
    }

    public void messung()
    {
    th1 = new Thread(new c1());
    th1.start();
    th2 = new Thread(new c2());
    th2.start();
    }  
    
}

allerdings bleibt das Prog nach dem Ablauf hängen.
 

Michael...

Top Contributor
Ein Thread "beendet" sich, sobald die run Methode abgeschlossen ist.
Um die Schleife in der run zu beenden könnte man z.B. ein Flag von aussen setzen.
 

papapete

Mitglied
Ok aber in der run() des 2-ten Threads hab ich doch
Java:
th1.interrupt();
        th2.interrupt();
warum werden die Threads dadurch nicht beendet?
 

tuttle64

Bekanntes Mitglied
Ok aber in der run() des 2-ten Threads hab ich doch
Java:
th1.interrupt();
        th2.interrupt();
warum werden die Threads dadurch nicht beendet?


Das geht so nicht. Angenommen Du hast eine boolsche Variable looping, die auf true gesetzt ist. Dann kann die while-Schleife mit while(looping) programmiert werden. Innerhalb der while-Schleife gibt es einen try/catch-Block, welches eine InterruptedException abfängt. Innerhalb dieses Blocks kann dann die boolsche Variable looping auf false gesetzt werden, die while-Schleife bricht dann ab und der Thread wird korrekt beendet.
 
Zuletzt bearbeitet:

papapete

Mitglied
Ahh ok jetzt bin ich etwas schlauer. Bekomme aber dabei:

Java:
boolean looping=true;
        while (looping){
        	try {
                jv.OutputAnalogChannel(2, jv.ReadAnalogChannel(2));
                
              } catch (InterruptedException e) {
				
			
                looping=false;
              } 
          //anzeige.setText(String.valueOf(jv.ReadAnalogChannel(2)));
          
        }

die Fehlermeldung dass der catch-Block nicht erreichbar ist.
Wenn ich eine andere while-Bedingung definiere (z.B. digitaler Eingang) dann funktioniert es.
 

Michael...

Top Contributor
Naja, hier läuft nichts, was eine InterruptedException werfen könnte ;-)
Du kannst z.B. das boolean Flag aus dem anderen Thread heraus auf false setzen.
 

tuttle64

Bekanntes Mitglied
die Fehlermeldung dass der catch-Block nicht erreichbar ist.

Es geht auch ohne boolsche Variable looping, hier ein Beispiel:

Code:
public class ThreadRunning extends Thread {
	public void run() {
		while (!isInterrupted()) {
			// do something
			try {
				Thread.sleep(0);
			} catch (InterruptedException e) {
				interrupt();
			}
		}
	}
}

Der Thread.sleep(0) ist wichtig, damit die InterruptedException abgefangen werden kann. Wird dieser Thread gestartet, wird mit der Methode interrupt() korrekt beendet.
 

papapete

Mitglied
Also ich bin ratlos... habs jetzt so versucht... es bleibt hängen.

Java:
import javax.swing.*;

import java.awt.*;

import java.awt.event.*;

public class test extends JFrame
{
    private JButton button1;
    private JPanel panelButton;
    private JLabel anzeige;
    private JLabel zeit;
    public T1 jv= new T1();
    public Thread th1;
    public Thread th2;
    

    public test()
    {
        super("Fenster");
        setLocation(300,300);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        getContentPane().setLayout(new BorderLayout(5,5));
        button1 = new JButton("Button 1");
        panelButton = new JPanel(new GridLayout(3,1));
        panelButton.add(button1);
        addButtonListener(button1);
        anzeige = new JLabel("Button klicken");
        zeit = new JLabel("Zeit");
        getContentPane().add(zeit);
        getContentPane().add(anzeige);
        getContentPane().add(BorderLayout.WEST, panelButton);
        pack();
        setVisible(true);

    }

    public static void main(String[] args)
    {
        test g = new test();
    }

    private void addButtonListener(JButton b)
    {
        b.addActionListener(new ActionListener() 
        { 
            public void actionPerformed(ActionEvent ae) 
            { 
                messung();
            }
        });
    }
    public class c2 extends Thread{
      public void run(){
        for (int i = 0; i <= 10; i++) {
      try {
        Thread.sleep(1000);
        //anzeige.setText(String.valueOf(i)+" sec");
        
      } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        interrupt();
      } 
      }
        jv.CloseDevice();
        th1.interrupt();
        th2.interrupt();
        
      }
    }
    
    public class c1 extends Thread{
      public void run(){
        jv.OpenDevice(0);
         while (true){
        	 jv.OutputAnalogChannel(2, jv.ReadAnalogChannel(2));
        	 anzeige.setText(String.valueOf(jv.ReadAnalogChannel(2)));
        	 if (isInterrupted()){
        		 break;}          
        }
      }
    }

    public void messung()
    {
    th1 = new Thread(new c1());
    th1.start();
    th2 = new Thread(new c2());
    th2.start();
    }  
    
}
 

tuttle64

Bekanntes Mitglied
Das Klassendesign ist sehr wirr: Th1 und Th2 werden innerhalb der Klasse test deklariert und gestarten um dann in der Klasse c2 unterbrochen zu werden?

Kannst Du bitte etwas genauer spezifizieren, was der Code tun soll?
 

papapete

Mitglied
Ja ist etwas wirr ich weiß...
th1 soll kontinuierlich den Analogwert auslesen und diesen im Textfeld anzeigen.
th2 soll 10 mal 1 sec stoppen (evtl. auch anzeigen 0-10 sec.) und dann beide Threads beenden.
 

xehpuk

Top Contributor
Du startest die Threads c1 und c2 nie. Daher bringen die Interrupts nichts.

Probier es mal so:
[JAVA=85]public void messung()
{
th1 = new c1();
th1.start();
th2 = new c2();
th2.start();
}[/code]
 

papapete

Mitglied
hab ich gemacht... gleiches Problem. Das Prog läuft ab, bleibt dann aber hängen d.h. gibt den Button nicht wieder frei und lässt sich nicht schließen. Läuft dann noch ne weile und "verschwindet" von alleine. Hab auch versucht die Klassen c1 und c1 ausserhalb von der Klasse test zu deklarieren --> keine Besserung
 

papapete

Mitglied
OK der Fehler muss irgendwo im Objekt jv zu finden sein.
Habe mal das ganze mit dem Interface auskommentiert und eine Zufallszahl anzeigen lassen ---> funktioniert.
 

Michael...

Top Contributor
OK der Fehler muss irgendwo im Objekt jv zu finden sein.
Das kann schon sein.
Hier mal ein (meiner Meinung) etwas besser stukturierter Code - allerdings mit der Flag Lösung
Java:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class ChannelRead extends JFrame {
	private JButton button1;
	private JLabel anzeige;
	private JLabel zeit;
	private T1 jv = new T1();
	
	public static void main(String[] args) {
		new ChannelRead();
	}

	public ChannelRead() {
		super("Fenster");
		setBounds(0, 0, 300, 200);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		zeit = new JLabel("Zeit", JLabel.CENTER);
		add(zeit, BorderLayout.NORTH);
		button1 = new JButton("Start");
		add(button1, BorderLayout.SOUTH);
		anzeige = new JLabel("Button klicken");
		add(anzeige, BorderLayout.CENTER);
		setVisible(true);
		
		button1.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent ae) {
				startMessung();
			}
		});
	}
	
	private volatile boolean loop = false;
	
	public void startMessung() {
		if (loop) //Wenn gerade eine Messung läuft
			return;
		
		loop = true;
		new Thread(new Runnable() {
			public void run() {
				jv.OpenDevice(0);
				while(loop) {
					jv.OutputAnalogChannel(2, jv.ReadAnalogChannel(2));
					anzeige.setText(String.valueOf(jv.ReadAnalogChannel(2)));
				}
				jv.CloseDevice();
				zeit.setText("Ende");
			}
		}).start();
		
		new Thread(new Runnable() {
			public void run() {
				for (int i = 0; i <= 10; i++) {
					try {
						zeit.setText("" + i);
						Thread.sleep(1000);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
				loop = false;
			}
		}).start();
	}
}
 

papapete

Mitglied
Vielen Vielen Dank... es funktioniert. Aber damit ich in Zukunft nicht ähnliche Fehler mache: Kann mir bitte jemand erklären wo genau mein Fehler war? Das mit dem loop hatte ich - auch wenn nicht so elegant - ja auch probiert.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
A Problem mit Thread.sleep Java Basics - Anfänger-Themen 4
G problem mit thread.sleep() Java Basics - Anfänger-Themen 6
M Threads Thread.Sleep Problem im Zusammenhang mit GUI/ActionPerformed-Methode Java Basics - Anfänger-Themen 4
G Problem mit sleep() Methode Java Basics - Anfänger-Themen 7
G Problem mit Thread Sleep! Java Basics - Anfänger-Themen 3
E Anfänger Problem mit Thread.sleep() Java Basics - Anfänger-Themen 11
R Best Practice Problem mit (einfacher) Doppelt-Schleife Java Basics - Anfänger-Themen 53
K Verständnis Problem bei Server/Client Java Basics - Anfänger-Themen 2
I WildFily - unterschiedliche Libs im Projekt verursachen Problem Java Basics - Anfänger-Themen 11
imocode Vererbung Problem mit Vererbung Java Basics - Anfänger-Themen 2
L Taschenrechner Problem Java Basics - Anfänger-Themen 4
I Applikationsserver (WildFly) - Zugriff auf Ressourcen.. Problem mit Pfade Java Basics - Anfänger-Themen 10
A ScheduledExecutorService problem Java Basics - Anfänger-Themen 7
marcelnedza Problem mit Weltzuweisung, JavaKarol Java Basics - Anfänger-Themen 13
XWing Methoden rückgabe Problem? Java Basics - Anfänger-Themen 6
M Erste Schritte Collatz Problem max int Java Basics - Anfänger-Themen 3
M Problem bei verschachtelter for-Schleife bei zweidimensionalen Arrays Java Basics - Anfänger-Themen 3
C GLOOP Problem beim Erstellen der Kamera Java Basics - Anfänger-Themen 9
nelsonmandela Problem bei Ausgabe einer Switch - Case Funktion Java Basics - Anfänger-Themen 5
frager2345 Problem mit Methode Java Basics - Anfänger-Themen 4
L Problem bei Rechnung mit Math.pow Java Basics - Anfänger-Themen 13
A Thread-Schreibe-Lese-Problem Java Basics - Anfänger-Themen 4
SUPERTJB return Problem Java Basics - Anfänger-Themen 3
sserio BigInteger Problem Java Basics - Anfänger-Themen 4
JordenJost Taschenrechner problem Java Basics - Anfänger-Themen 5
K Problem mit "Random" Java Basics - Anfänger-Themen 5
S Datei anlegen Problem! Groß- und Kleinschreibung wird nicht unterschieden Java Basics - Anfänger-Themen 4
sserio Problem beim Anzeigen Java Basics - Anfänger-Themen 5
xanxk Problem For-Schleife mit Charakter Java Basics - Anfänger-Themen 2
L Unbekanntes Problem mit 2d Array Java Basics - Anfänger-Themen 6
sserio Liste erstellt und ein Problem mit dem Index Java Basics - Anfänger-Themen 8
sserio Schwimmen als Spiel. Problem mit to String/ generate a card Java Basics - Anfänger-Themen 4
J Schleife Problem Java Basics - Anfänger-Themen 2
D Problem mit der Erkennung von \n Java Basics - Anfänger-Themen 2
milan123 das ist meine aufgabe ich hab das problem das bei mir Wenn ich die Richtung der Linien verändern will und drei davon sind richtig, verändere ich die 4 Java Basics - Anfänger-Themen 3
M Verständins Problem bei Aufgabe Java Basics - Anfänger-Themen 4
HeiTim Problem mit der Kommasetzung an der richtigen stelle Java Basics - Anfänger-Themen 59
Temsky34 Problem mit dem Code Java Basics - Anfänger-Themen 17
P Problem mit Calendar.getDisplayName() Java Basics - Anfänger-Themen 8
C Problem mit mehreren Methoden + Scanner Java Basics - Anfänger-Themen 5
P Datei einlesen, nach Begriff filtern und in Datei ausgeben. Problem Standardausgabe über Konsole Java Basics - Anfänger-Themen 19
M Problem mit Klassenverständnis und Button Java Basics - Anfänger-Themen 8
EchtKeineAhnungManchmal hallo habe ein Problem mit einer Datei -> (Zugriff verweigert) Java Basics - Anfänger-Themen 4
H Problem mit Verzweigungen Java Basics - Anfänger-Themen 6
H Problem mit Rückgabewert Java Basics - Anfänger-Themen 7
josfe1234 JAVA FX problem Java Basics - Anfänger-Themen 3
A Code Problem Java Basics - Anfänger-Themen 6
Henri Problem von Typen Java Basics - Anfänger-Themen 7
J Problem mit "ArrayIndexOutOfBoundsException" Java Basics - Anfänger-Themen 11
K jackson Mapping - Problem mit Zeitzonen Java Basics - Anfänger-Themen 10
B Threads Problem mit mehreren Threads Java Basics - Anfänger-Themen 38
I Output BigDecimal anstatt double / Problem beim Rechnen Java Basics - Anfänger-Themen 16
D Schleifen Problem Java Basics - Anfänger-Themen 2
H So viele Fehlermeldungen, dass ich nicht weiß wo das Problem ist. Java Basics - Anfänger-Themen 6
J JAVA-Problem blockiert MEDIATHEKVIEW Java Basics - Anfänger-Themen 13
T Problem mit Lehrzeichen und String bei einfacher Chiffre Java Basics - Anfänger-Themen 8
J extends Problem Java Basics - Anfänger-Themen 2
C Polymorphie-Problem Java Basics - Anfänger-Themen 3
Kalibru Problem bei Ausgabe von Objekt Java Basics - Anfänger-Themen 1
I Format Problem mit Wert - bekomme 0,10 anstatt 10,00 Java Basics - Anfänger-Themen 6
J Problem mit einer Methode die gewissen Inhalt einer Array löschen soll Java Basics - Anfänger-Themen 9
J Problem mit einer Methode, die beliebig viele Objekte in Array speichern soll Java Basics - Anfänger-Themen 6
J Allgemeines Problem mit Klassen Java Basics - Anfänger-Themen 5
U Problem mit dem initialisieren meines Strings in einer Schleife Java Basics - Anfänger-Themen 5
amgadalghabra algorithmisches Problem Java Basics - Anfänger-Themen 19
J Traveling Salesman Problem [Arrays] Java Basics - Anfänger-Themen 9
R ArrayList Problem Java Basics - Anfänger-Themen 6
InfinityDE Problem mit Datenübergabe an Konstruktor Java Basics - Anfänger-Themen 7
C RegEx Problem Java Basics - Anfänger-Themen 4
J Anfänger TicTacToe, Problem bei Gewinnoption, sowohl Unentschieden Java Basics - Anfänger-Themen 8
E Taschenrechner GUI Problem mit Fehlerhandling Java Basics - Anfänger-Themen 6
M Input/Output Fallunterscheidung Problem Java Basics - Anfänger-Themen 17
P Problem beim Überschreiben einer vererbten Methode Java Basics - Anfänger-Themen 4
M Problem bei Ausgabe Java Basics - Anfänger-Themen 7
Splayfer Java Array Problem... Java Basics - Anfänger-Themen 2
G Problem bei der Ausgabe einer Main Claase Java Basics - Anfänger-Themen 7
F Problem mit KeyListener in kombination mit dem ActionListener Java Basics - Anfänger-Themen 4
G Subset sum problem mit Backtracking Java Basics - Anfänger-Themen 18
N Problem mit Scanner Java Basics - Anfänger-Themen 2
J Klassen Problem Java Basics - Anfänger-Themen 8
A Out.format problem. Java Basics - Anfänger-Themen 3
J Problem bei der Programmierung eines Tannenbaums Java Basics - Anfänger-Themen 9
A Array problem Java Basics - Anfänger-Themen 16
2 Taschenrechner mit GUI Problem bei der Berechnung Java Basics - Anfänger-Themen 8
W Remote Method Invocation RMI - Problem Java Basics - Anfänger-Themen 0
I Ich habe ein Problem Java Basics - Anfänger-Themen 3
A Problem bei returnen eines Wertes Java Basics - Anfänger-Themen 6
M Regex Erstellung Problem Java Basics - Anfänger-Themen 2
D Input/Output Problem bei der Benutzereingabe eines Befehls Java Basics - Anfänger-Themen 14
M (Sehr großes Problem) Listen als static in anderen Klassen verwendet Java Basics - Anfänger-Themen 12
F Habe ein problem mit dem ActionListener Java Basics - Anfänger-Themen 3
C Regex-Problem Java Basics - Anfänger-Themen 4
J Problem beim vergleich von zwei Integer Java Basics - Anfänger-Themen 3
M Problem in der Modellierung Java Basics - Anfänger-Themen 20
W Wo ist das URL-Problem ? Java Basics - Anfänger-Themen 1
S Generics-Problem: Class, Class<?>, Class<Object> Java Basics - Anfänger-Themen 4
D FileWriter / FileReader Problem Java Basics - Anfänger-Themen 10
G Problem beim Speichern von Objekten in einer Datei Java Basics - Anfänger-Themen 7
S Compiler-Fehler Exception in thread "main" java.lang.Error: Unresolved compilation problem: Java Basics - Anfänger-Themen 6
J Problem mit Array: 2 Klassen Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben