Delay erzeugen, ohne Programm zu blockieren

Javaman91

Bekanntes Mitglied
Hallo,

ich weiß nicht wie ich ein Delay erzeugen kann, ohne dass mein Programm während das Delay ausgeführt wird blockiert ist und nicht mehr auf Inputs reagiert.
Thread.sleep(); funktioniert wunderbar, aber während Thread.sleep(); abgearbeitet wird, reagiert das Programm einfach nicht auf Inputs wie z.B. Maus klicks, Tastatur, Buttons die angeklcikt werden usw.

Das ist ein Problem, da ich das Programm jeder Zeit abrechnen möchte, egal ob gerade das Delay ausgeführt wird oder nicht.

Wie kann ich das ganz einfach machen?
Für ein Beispiel wäre ich euch sehr dankbar.

Viele Grüße
 

KonradN

Super-Moderator
Mitarbeiter
Du scheinst von einer UI Anwendung zu sprechen. Die blockiert schlicht nicht! An der Stelle, an der etwas aufhören soll, hörst Du einfach auf. Und wenn es weiter gehen soll, dann machst Du weiter. Wenn dies zeitlich gesteuert sein soll, dann kommt z.B. ein Timer in Frage.
 

Blender3D

Top Contributor
Hallo,

ich weiß nicht wie ich ein Delay erzeugen kann, ohne dass mein Programm während das Delay ausgeführt wird blockiert ist und nicht mehr auf Inputs reagiert.
Thread.sleep(); funktioniert wunderbar, aber während Thread.sleep(); abgearbeitet wird, reagiert das Programm einfach nicht auf Inputs wie z.B. Maus klicks, Tastatur, Buttons die angeklcikt werden usw.

Das ist ein Problem, da ich das Programm jeder Zeit abrechnen möchte, egal ob gerade das Delay ausgeführt wird oder nicht.

Wie kann ich das ganz einfach machen?
Hier eine einfache Klasse PauseWorker die du als Schablone für das Problem verwenden kannst.
Anbei das Demo zum Testen.
Java:
import javax.swing.JFrame;

public class StartPauseDemo {

    public static void main(String[] args) {
        JFrame frame = new JFrame("Pause Demo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        PausePanel pausePanel = new PausePanel(400, 400);
        frame.add(pausePanel);
        frame.pack();
        frame.addKeyListener(pausePanel.getKeyBoard());
        frame.setVisible(true);
    }
}
Java:
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.JPanel;

@SuppressWarnings("serial")
public class PausePanel extends JPanel {
    private int count = 0;

    protected PauseWorker worker = new PauseWorker() {
        @Override
        protected boolean executeJob() {
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
            }
            count++;
            repaint();
            return false;
        }
    };

    public PausePanel(int width, int height) {
        setPreferredSize(new Dimension(width, height));
        worker.start();
    }

    public KeyAdapter getKeyBoard() {
        return new KeyAdapter() {
            @Override
            public void keyReleased(KeyEvent e) {
                int code = e.getKeyCode();
                if (code == KeyEvent.VK_ESCAPE)
                    worker.pause();
                if (code == KeyEvent.VK_R)
                    worker.resume();
            }
        };
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        int fontSize = 25;
        g.setFont(new Font("Courier", Font.BOLD, fontSize));
        g.drawString(count + "", (getWidth() - fontSize) / 2, (getHeight() - fontSize) / 2);
        g.drawString("Press '" + (worker.isPause() ? "R' to resume" : "ESC' to pause") + " job", 10, 2 * fontSize);
    }

}
Java:
public abstract class PauseWorker implements Runnable {
    private boolean pause = false;
    private boolean running = false;
    private Thread thread = null;

    protected abstract boolean executeJob();

    public final boolean isPause() {
        return pause;
    }

    public final boolean isRunning() {
        return running;
    }

    public final void pause() {
        pause = true;
    }

    public final void resume() {
        pause = false;
    }

    @Override
    public final void run() {
        while (running) {
            if (!pause)
                executeJob();
            else {
                try {
                    Thread.sleep(10);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    public final void start() {
        if (running)
            return;
        running = true;
        pause = false;
        thread = new Thread(this);
        thread.start();
    }

    public final void stop() {
        running = false;
        pause = true;
        while (thread != null && thread.isAlive())
            ;
        thread = null;
    }
}
;)
 

Anhänge

  • pauseDemo.jar
    4,2 KB · Aufrufe: 0
Zuletzt bearbeitet:

White_Fox

Top Contributor
Thread.sleep(); funktioniert wunderbar, aber während Thread.sleep(); abgearbeitet wird, reagiert das Programm einfach nicht auf Inputs wie z.B. Maus klicks, Tastatur, Buttons die angeklcikt werden usw.
Kein Wunder...du hast den Thread, in dem dein Programm ausgeführt wird, schlafen geschickt. Natürlich tut der dann nix mehr.

Die Kunst, die Blender3D bereits demonstriert hat, besteht darin, die Arbeit an einen anderen Thread auszulagern. Also diesen Thread dann entweder die Abbrucheingabe entgegenzunehmen. Oder nach einer gewissen Zeit eben die gewünschte Aktion selber ausführt, wie du das aufteilst ist egal.
 

Javaman91

Bekanntes Mitglied
Vielen Dank für eure Hilfe!
Auch für das sehr ausführliche Beispiel!!
Ich habs mal mit dem Timer probiert, den habe ich zuvor noch nie verwendet.

Soweit funktioniert das mit dem Timer echt super.
Was mir aber aufgefallen ist, ist das wenn die run() - Methode mit sehr geringen Zeitabständen aufgerufen wird, das Programm nicht sofort beendet wird, wenn ich z.B. die Maus klicke.
Läuft der Timer z.B. mit 1000ms, dann unterbricht das Programm beim Mausklick sofort.
Läuft er aber z.B. mit nur 10ms, dann muss ich sehr oft die Maus betätigen, bis das Programm reagiert.

Da muss ich noch etwas herumprobieren.

Schöne Grüße
 

Javaman91

Bekanntes Mitglied
Ganz einfacher Code.
Ich habe ein JFrame mit JPanel und darauf buttons.
Beim anklicken vom button "move" startet das Programm.

Hier ist der Teil des Codes, wo alles passiert:

Java:
@Override
public void actionPerformed(ActionEvent e) {
    if(e.getSource() == move) { // JButton move

          timer = new Timer(); // Timer als globale Variable
          TimerTask task = new TimerTask(){
                                                               
                    @Override
                    public void run(){

                    // Hier ist der Code der nach einer Zeit vom Timer aufgerufen wird.
                    // Hier wird nur eine Zufallszahl generiert und dann als Position
                    // an rob.mouseMove übergeben.
                        
                    rob.mouseMove(randomNumberX, randomNumberY);
                    }
                };
                timer.schedule(task, 10, 10);   
            }   
        }
    
    @Override
        public void mouseClicked(MouseEvent e) {
            
            if(SwingUtilities.isRightMouseButton(e)) {
                timer.cancel();
                System.out.println("Stop");
            }   
        }

Wie gesagt, mit 1000ms bei timer.schedule funktioniert es wunderbar, mit 10ms fast garnicht mehr.

SG
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
C Wie erstellt man einen Timer/Delay? Java Basics - Anfänger-Themen 1
I Runtime.getRuntime mit delay? Java Basics - Anfänger-Themen 2
M Versand von Nachrichten via Socket (Delay) Java Basics - Anfänger-Themen 21
S Java TimerTask mit Delay Java Basics - Anfänger-Themen 5
F Sleep, pause, delay Java Basics - Anfänger-Themen 2
W Objekte erzeugen Httprequest oder Httpclient Java Basics - Anfänger-Themen 3
W Javadoc HTML erzeugen mit allen dependency Java Basics - Anfänger-Themen 11
Say abstract class und Objekt erzeugen - Dringend Hilfe Java Basics - Anfänger-Themen 10
BeginnerJava String mit vorgegebener Länge und Buchstaben erzeugen/ mit Leerstellen Java Basics - Anfänger-Themen 8
frager2345 Singleton-Muster Java ->Nur eine Instanz einer Klasse erzeugen können Java Basics - Anfänger-Themen 45
H Artefact mit Bild erzeugen Java Basics - Anfänger-Themen 11
E Rekursiv Objekte erzeugen - geht das? Java Basics - Anfänger-Themen 2
F Aus eingelesener Datei korrekt Objekte erzeugen Java Basics - Anfänger-Themen 5
D Hilfe beim Erzeugen eines Arrays NullPointerException wird ausgelöst Java Basics - Anfänger-Themen 11
C Runnable Jar-File erzeugen Java Basics - Anfänger-Themen 14
W Mehrfach das gleiche Attribut für ein Objekt erzeugen (mit verschiedenen Werten) Java Basics - Anfänger-Themen 2
Lena_2611 Vergleich von Array1 Index mit Array2 Wert und erzeugen eines neues Arrays Java Basics - Anfänger-Themen 8
C Instanzen, wann muss ich Instanzen erzeugen & wo?) Java Basics - Anfänger-Themen 23
S Erzeugen einer eindeutigen ID Java Basics - Anfänger-Themen 2
E Objekt durch Benutzer über Konsole erzeugen - Java Java Basics - Anfänger-Themen 3
L Simples Spielfeld erzeugen Java Basics - Anfänger-Themen 1
G Anklickbaren Text erzeugen Java Basics - Anfänger-Themen 2
I Object-Oriented Programming, Objekt erzeugen Java Basics - Anfänger-Themen 1
P Objekt aus String-Array erzeugen Java Basics - Anfänger-Themen 104
S Mit nextGaussian() positive Zahlen erzeugen? Java Basics - Anfänger-Themen 39
S Array erzeugen mit verschiedener Verteilung Java Basics - Anfänger-Themen 11
B Automatisch Objekte erzeugen mit verschiedenen Namen Java Basics - Anfänger-Themen 4
L Dynamische Anzahl an Arrays mit verschiedenen Namen erzeugen Java Basics - Anfänger-Themen 6
J Doppelte Ausgabe erzeugen Iterator Java Basics - Anfänger-Themen 6
N ArrayList in eigener Klasse erzeugen mit Zugriff Java Basics - Anfänger-Themen 7
K Methoden JTExtField mit Array erzeugen Java Basics - Anfänger-Themen 13
B Kann man eine Tabelle in Eclipse erzeugen und damit arbeiten? Java Basics - Anfänger-Themen 8
E Best Practice Jar-file mit zwei Klassen und externer Bibliothek über Konsole erzeugen Java Basics - Anfänger-Themen 13
I TextField Array mit for Loop erzeugen Java Basics - Anfänger-Themen 4
M Objekte mit einer Schleife mehrmals erzeugen Java Basics - Anfänger-Themen 17
G Objekt der selben Klasse wie selbst mit Aufrufen des Konstruktors erzeugen Java Basics - Anfänger-Themen 14
J Eindeutige Nummer (8 stellig) erzeugen Java Basics - Anfänger-Themen 9
C Instanz einer Klasse während if-Abfrage erzeugen und bei zweiter if-Abfrage wiederverwenden Java Basics - Anfänger-Themen 6
B OOP Objekt in IF erzeugen - funktioniert nicht so richtig Java Basics - Anfänger-Themen 11
neerual Int-Felder erzeugen Java Basics - Anfänger-Themen 16
R Objekte zur Laufzeit in Schleife erzeugen und in ArrayList ablegen Java Basics - Anfänger-Themen 4
D Erste Schritte Random erzeugen Java Basics - Anfänger-Themen 28
P Objekt mit =new in Methode erzeugen Java Basics - Anfänger-Themen 4
L Threads Laufbild Erzeugen Problem mit Aktualisieren des JPanels Java Basics - Anfänger-Themen 2
J In Java einen Ton erzeugen Java Basics - Anfänger-Themen 8
C Array Muster erzeugen Java Basics - Anfänger-Themen 2
S Objekte "gegebenfalls" erzeugen Java Basics - Anfänger-Themen 5
D Java Ausdruck erzeugen / Formular Java Basics - Anfänger-Themen 4
N Objekt in Methode einer anderen Klasse erzeugen Java Basics - Anfänger-Themen 9
R Baum erzeugen Java Basics - Anfänger-Themen 61
D Objekt per If erzeugen. Java Basics - Anfänger-Themen 11
J Bildschirmausgabe erzeugen Java Basics - Anfänger-Themen 30
B Beliebig viele Rechtecke erzeugen Java Basics - Anfänger-Themen 5
J Objekt mit Methodendruchlauf erzeugen Java Basics - Anfänger-Themen 1
Detox Class Datei erzeugen nicht möglich über cmd Java Basics - Anfänger-Themen 1
P Erste Schritte [gelöst]Erzeugen einer Klasse aus der Klassenbibliothek Java Basics - Anfänger-Themen 4
C Int mit vorangestellten Nullen und maximal 4 stellen erzeugen. Java Basics - Anfänger-Themen 4
P Input/Output Objekte per Eingabe erzeugen Java Basics - Anfänger-Themen 1
D Erste Schritte Dynamisch Objekte erzeugen und diese durchsuchen Java Basics - Anfänger-Themen 7
U JNA: Strukturen erzeugen Java Basics - Anfänger-Themen 8
S Variablen Variable erzeugen und Array mit Variablen befüllen Java Basics - Anfänger-Themen 26
S Header- Datei erzeugen mit javah Java Basics - Anfänger-Themen 1
J Objekte zur Laufzeit erzeugen und direkt verwenden Java Basics - Anfänger-Themen 9
R Erste Schritte Schleife erzeugen (mit If Anweisung) Java Basics - Anfänger-Themen 3
I HTML Tabelle nur so lange erzeugen bis Höhe erreicht Java Basics - Anfänger-Themen 9
M Zusatzzahlen in array erzeugen Java Basics - Anfänger-Themen 5
B Stützstellen (Vektor) erzeugen? Java Basics - Anfänger-Themen 8
Z Erste Schritte 9x9 Felder Erzeugen+Aufrufen Java Basics - Anfänger-Themen 1
Y Variable Menge von Objekten erzeugen und mit ihren Attributen rechnen Java Basics - Anfänger-Themen 7
J Anzahl von for-Schleifen in Abhängigkeit von Zahleneingabe erzeugen Java Basics - Anfänger-Themen 1
J JLabels in schleife erzeugen mit verschiedenen namen? Java Basics - Anfänger-Themen 5
K JLabel zur Laufzeit dynamisch erzeugen Java Basics - Anfänger-Themen 7
F Input/Output Blocking file read erzeugen Java Basics - Anfänger-Themen 0
Thallius Klassen aus Classname programmatisch erzeugen. Wie geht das in java? Java Basics - Anfänger-Themen 5
B Zufallsdatum innerhalb eines bestimmten Bereiches erzeugen Java Basics - Anfänger-Themen 3
D JComboBox erzeugen Java Basics - Anfänger-Themen 1
J Erste Schritte Array dyn. erzeugen Java Basics - Anfänger-Themen 2
A OOP Objekte per Schleife erzeugen Java Basics - Anfänger-Themen 1
F Superklasse nochmals erzeugen? Java Basics - Anfänger-Themen 7
G Instanzen eines Interfaces erzeugen Java Basics - Anfänger-Themen 7
M Variablen Variable zur Laufzeit erzeugen Java Basics - Anfänger-Themen 3
P Vererbung Neues Objekt aus Vorlage erzeugen Java Basics - Anfänger-Themen 1
M Erzeugen beliebig vieler Objekte, aber wie wechselnde Bezeichner? Java Basics - Anfänger-Themen 5
W Objekte erzeugen Java Basics - Anfänger-Themen 2
N Interface Interface (sinnvoll) erzeugen Java Basics - Anfänger-Themen 8
L 6stellige Zufallszahlen erzeugen & auf einzigartigkeit prüfen Java Basics - Anfänger-Themen 3
A Kleinste Ziffer im Array suchen um Sortierung zu erzeugen Java Basics - Anfänger-Themen 2
Joew0815 Interface JSON Objekte aus Java Objekten erzeugen Java Basics - Anfänger-Themen 9
B OOP Objekte erzeugen mit Hilfe einer for Schleife Java Basics - Anfänger-Themen 29
Helgon Baumstruktur tiefe N erzeugen Java Basics - Anfänger-Themen 3
X Mehrere Objekte erzeugen Java Basics - Anfänger-Themen 8
G OOP-Frage - Grundlegendes zum erzeugen von Klassen Java Basics - Anfänger-Themen 7
P Kapselung Variable innerhalb einer inneren Klasse ansprechen ohne ein Objekt erzeugen zu müssen? Java Basics - Anfänger-Themen 6
G Methoden BigInteger Zufallszahlen erzeugen Java Basics - Anfänger-Themen 5
Phash Kombinationen erzeugen Java Basics - Anfänger-Themen 4
M Initialisierungsblock beim Erzeugen einer Instanz Java Basics - Anfänger-Themen 6
B Ein Array von Map erzeugen, wie??? Java Basics - Anfänger-Themen 3
M Neues Objekt erzeugen mit Klassennamen oder ohne Java Basics - Anfänger-Themen 5
L Button erzeugen. Java Basics - Anfänger-Themen 4
Manello GUI mit exe erzeugen? Java Basics - Anfänger-Themen 3

Ähnliche Java Themen


Oben