Warten auf Eingabe

Status
Nicht offen für weitere Antworten.
G

Gast

Gast
Mein Problem ist folgendes:

Ich möchte das der Benutzer ein Ergebnis eingebit und wenn er es nach
einer gewissen Zeit nicht gemacht hat soll der nächste Befehl ausgeführt werden.

Ich danke schon mal im voraus.
 

André Uhres

Top Contributor
Du könntest vor jeder Eingabe einen Thread starten, der z.B. 5 Sekunden schläft
und danach selbst eine Eingabe tätigt.
Wenn nach der Eingabe der Thread noch lebt, dann hat der Benutzer etwas eingegeben
und du kannst den Thread abbrechen.
Ansonsten hat der Thread etwas eingegeben.
 
S

SlaterB

Gast
gehts eigentlich um die Konsole oder eine GUI?

kann man denn in System.in was reinschreiben?
kann man ein read() darauf abbrechen?
 

André Uhres

Top Contributor
>gehts eigentlich um die Konsole oder eine GUI?
Bei Fragen dieser Art geht's wohl meistens um die Konsole.

>kann man denn in System.in was reinschreiben?
Ja natürlich, sonst könnte man ja auch nix auslesen :wink:

>kann man ein read() darauf abbrechen?
Den read() kann man durch eine Eingabe abbrechen.
 
G

Gast

Gast
Erstmal danke für die Antworten!

Aber wie sieht dann der Quelltext aus und wann merkt der Thread das etwas eingegeben wurde
bzw. ich müsste ja dann die Zeile Eingabe überspringen falls die Zeit vorüber ist.

Wie mache ich das konkret???
 

moormaster

Top Contributor
Gast hat gesagt.:
Erstmal danke für die Antworten!

Aber wie sieht dann der Quelltext aus und wann merkt der Thread das etwas eingegeben wurde
bzw. ich müsste ja dann die Zeile Eingabe überspringen falls die Zeit vorüber ist.

Wie mache ich das konkret???

Thread
Code:
  ...
  Thread.sleep(5000);

  if (!isInterrupted())
   // tätige Eingabe

Eingabe:
Code:
  ...
  // lese Benutzereingabe
  // breche Thread ab
  [Thread Referenz].interrupt();

Um das mal Beispielhaft zu skizzieren :D
 

moormaster

Top Contributor
SlaterB hat gesagt.:
André Uhres hat gesagt.:
Ja natürlich, sonst könnte man ja auch nix auslesen :wink:
hast du dafür ein Beispiel?

Im System.in landet normaler Weise alles, was der User in die Konsole des Programms eintippt... (oder was per Pipe in die Standardeingabe deines Programms geleitet wurde beim Programmaufruf vom Betriebssystem aus)
 
S

SlaterB

Gast
das ist kein Beispiel [zu 'selber per nebenläufigen Thread eine zusätzliche Eingabe erzeugen'] ;)
 

André Uhres

Top Contributor
Hier ist ein funktionierendes Beispiel:
Code:
package basics;

/*
 * KonsoleTest.java
 */

import java.awt.*;
import java.awt.event.*;
import java.util.*;
import java.util.logging.*;

public class KonsoleTest {

    private Scanner scanner;
    private String inputString;
    private Bedenkzeit bedenkzeit;
    private Thread bedenkzeitThread;

    public KonsoleTest() {
        scanner = new Scanner(System.in);
        inputString = "";
        System.out.println("*** Die Konsole muss bis Programmende den Fokus haben! ***");
        System.out.println("Bitte Text eingeben, end = Programmende");
        while (!inputString.equalsIgnoreCase("end")) {
            bedenkzeit = new Bedenkzeit();
            bedenkzeitThread = new Thread(bedenkzeit);
            bedenkzeitThread.start();
            inputString = scanner.next();
            bedenkzeit.setInput(true);
            if (inputString.toLowerCase().contains("xyz")) {
                //Eingabe vom Thread
                System.out.println("Upps! Bedenkzeit abgelaufen.");
            } else {
                //Benutzereingabe:
                System.out.println("OK: " + inputString);
            }
        }
    }

    public static void main(String[] args) {
        new KonsoleTest();
    }
}

class Bedenkzeit implements Runnable {

    private Robot robot;
    //Array für Tastaturdaten (um den Text zu schreiben):
    private int[] keyInput = {KeyEvent.VK_X, KeyEvent.VK_Y, KeyEvent.VK_Z};
    private boolean input;
    private int count;

    public Bedenkzeit() {
        //wenn die Bedenkzeit abgelaufen ist,
        //dann übernimmt einfach ein Roboter die Eingabe
        try {
            robot = new Robot();
        } catch (AWTException ex) {
            Logger.getLogger(Bedenkzeit.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    @Override
    public void run() {
        while (!input && count < 100) {
            //warten auf Eingabe oder bis Bedenkzeit abgelaufen
            try {
                Thread.sleep(50);
            } catch (Exception ex) {
            }
            count++;
        }
        if (!input) {
            //falls keine Eingabe erfolgte..
            doInput(); //..übernimmt der Thread die Eingabe
        }
    }

    private void doInput() {
        for (int i = 0; i < keyInput.length; i++) {
            robot.keyPress(keyInput[i]);
            robot.keyRelease(keyInput[i]);
        }
        robot.keyPress(KeyEvent.VK_ENTER);
        robot.keyRelease(KeyEvent.VK_ENTER);
    }

    public void setInput(boolean b) {
        input = b;
    }
}
Oder so:
Code:
package basics;

/*
 * KonsoleTest2.java
 */

import java.awt.*;
import java.awt.event.*;
import java.io.IOException;
import java.util.*;
import java.util.logging.*;

public class KonsoleTest2 {

    private Scanner scanner;
    private String inputString;
    private int count;

    public KonsoleTest2() {
        scanner = new Scanner(System.in);
        inputString = "";
        System.out.println("Bitte Text eingeben, end = Programmende");
        while (!inputString.equalsIgnoreCase("end")) {
            try {
                while (System.in.available() <= 0 && count < 100) {
                    //warten auf Eingabe oder bis Bedenkzeit abgelaufen
                    try {
                        Thread.sleep(50);
                    } catch (Exception ex) {
                    }
                    count++;
                }
                if (count < 100) {
                    //Benutzereingabe:
                    inputString = scanner.next();
                    System.out.println("OK: " + inputString);
                } else {
                    System.out.println("Upps! Bedenkzeit abgelaufen.");
                }
                count = 0;
            } catch (IOException ex) {
                Logger.getLogger(KonsoleTest2.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

    public static void main(String[] args) {
        new KonsoleTest2();
    }
}
 
S

SlaterB

Gast
na das ist ja sehr eingängig ;)
auch noch Fokus nötig

für andere Streams als System.in gibts dann aber endgültig keine Möglichkeit, etwas hineinzuschreiben/ ein read() abzubrechen?
ist definiert, was passiert, wenn ein read()-wartender Thread abgebrochen wird/ kann man den überhaupt beenden? (moormasters Posting traue ich mal nicht ganz ;) )
kann man den Stream dann noch verwenden?
 

moormaster

Top Contributor
Wieso liest du denn mit read() blockierend ein? Einen Inpuitstream kann man doch per available() Methode Fragen, wieviele Bytes schon gelesen werden können, ohne dass der entsprechende read Aufruf (welcher dann höchstens diese Anzahl von Bytes einliest) das Programm blockiert.
 
S

SlaterB

Gast
> Wieso liest du denn mit read() blockierend ein?

da es mir um die theoretischen Möglichkeiten geht, stellt sich diese Randbedingung nicht

für den Originalposter ist das allerdings eine deutlich einfachere Alternative als den Robot oder?
guter Tipp von dir ;)
einfach gar nicht read()-en sondern available()-n,
wenn innerhalb von 5 sec Daten da sind, dann diese lesen, sonst davon ausgehen, dass nichts eingetippt wurde,

dürfe ganz ohne Threads laufen, das Hauptprogramm kann mit
Thread.sleep(100); 100 ms schlafen gelegt werden,
das 50x, zwischendurch mit available() nachschauen, dann sind 5 sec vorbei

-----

meine Frage bezieht sich aber durchaus auf die Situation, wenn read() schon läuft,
Stream beenden ist etwas drastisch, dann dürfte wohl der wartende Thread wieder erwachen,
aber gehts auch mit weiterlebenden Stream?

mir fällt auf die Schnelle nur System.in als so wichtigen Stream ein, der nicht beendet werden sollte,
aber auch allgemein interessant
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
S in ActionListener auf Eingabe aus anderem Frame warten Java Basics - Anfänger-Themen 2
B Während Schleife nicht auf Eingabe warten Java Basics - Anfänger-Themen 2
S Programmablauf pausieren, bzw. auf Eingabe warten Java Basics - Anfänger-Themen 4
H JavaFX Hintergrundfarbe ändern, warten, Hintergrundfarbe wieder ändern Java Basics - Anfänger-Themen 34
D Programm auf Enter warten lassen Java Basics - Anfänger-Themen 2
E Richtiges Warten Java Basics - Anfänger-Themen 8
G Wie kann ich 1s lang warten? Java Basics - Anfänger-Themen 1
D JFrame - 10 Sekunden bis zum schließen warten. Java Basics - Anfänger-Themen 2
R Threads aufeinander warten lassen? Java Basics - Anfänger-Themen 10
S Input/Output In Java Swing auf Button warten? Java Basics - Anfänger-Themen 9
A Thread auf anderen warten Java Basics - Anfänger-Themen 2
C Warten auf Antwort Java Basics - Anfänger-Themen 22
S Threads Programm terminiert statt zu warten Java Basics - Anfänger-Themen 20
E ExecutorService warten bis alles fertig? Java Basics - Anfänger-Themen 5
A Threads Eine Klasse muss auf Variable der Anderen warten. Java Basics - Anfänger-Themen 6
D Input/Output Auf Tasteneingabe warten Java Basics - Anfänger-Themen 4
A Activity1 soll auf Activity2 warten (Camera-Intent) Java Basics - Anfänger-Themen 5
D Threads Kartenspiel - auf legen warten Java Basics - Anfänger-Themen 15
B Methode warten lassen bis Button gedrückt wird Java Basics - Anfänger-Themen 16
JAVAnnik auf Threadende warten Java Basics - Anfänger-Themen 6
H Auf Threads warten Java Basics - Anfänger-Themen 3
S Warten bis alle Threads fertig sind Java Basics - Anfänger-Themen 12
I Auf DB-Operation warten Java Basics - Anfänger-Themen 2
R Thread soll auf andere Threads warten Java Basics - Anfänger-Themen 3
T Warteschlange warten lassen bis Ereignis Java Basics - Anfänger-Themen 27
A Main warten lassen bis Variable durch Button übergeben wird Java Basics - Anfänger-Themen 2
V Warten bis die Länge eines Strings nicht mehr 0 ist Java Basics - Anfänger-Themen 13
M prozess starten und warten bis dieser sich beendet Java Basics - Anfänger-Themen 3
G Eigene Klasse für externe Befehle - Warten auf Prozesse Java Basics - Anfänger-Themen 6
D Auf Event warten Java Basics - Anfänger-Themen 4
F Logikproblem: Auf Mouselistener warten Java Basics - Anfänger-Themen 6
E Auf Mouselistener warten?! Java Basics - Anfänger-Themen 20
M Warten bis Thread an einem Semaphore angekommen ist Java Basics - Anfänger-Themen 4
C countdown/timer/Zeit warten lassen Java Basics - Anfänger-Themen 14
S Auf andere Methode warten Java Basics - Anfänger-Themen 7
T auf vbscript warten Java Basics - Anfänger-Themen 3
S Thread warten abbrechen? Java Basics - Anfänger-Themen 5
C auf beendigung eines threads warten Java Basics - Anfänger-Themen 6
P Warten auf KeyTyped Java Basics - Anfänger-Themen 7
M warten in einer while-schleife Java Basics - Anfänger-Themen 12
L programm zum warten zwingen Java Basics - Anfänger-Themen 4
B Auf Programm warten Java Basics - Anfänger-Themen 2
S Auf Object warten Java Basics - Anfänger-Themen 2
K Auf File- Befehl warten. Java Basics - Anfänger-Themen 10
T eine Sekunde warten Java Basics - Anfänger-Themen 11
C Konsolenanwendung auf belibige Taste warten Java Basics - Anfänger-Themen 2
D Auf anderes Fenster Warten Java Basics - Anfänger-Themen 6
A Warten auf Userinput Java Basics - Anfänger-Themen 2
G Bei JDialog warten Java Basics - Anfänger-Themen 5
T Auf Selection warten Java Basics - Anfänger-Themen 7
N Java Insel 6 lesen oder auf 7 warten ? Java Basics - Anfänger-Themen 11
G Thread soll warten Java Basics - Anfänger-Themen 5
F 1 Minute warten Java Basics - Anfänger-Themen 18
S Thread auf Thread warten lassen. Java Basics - Anfänger-Themen 2
G auf ende mehrerer threads warten Java Basics - Anfänger-Themen 2
B Timer / Thread warten Java Basics - Anfänger-Themen 3
G warten Java Basics - Anfänger-Themen 10
P Warten-Fenster Java Basics - Anfänger-Themen 8
vogella *Gelöst *Im Programm warten (wait()) Java Basics - Anfänger-Themen 2
A Bitte Warten Java Basics - Anfänger-Themen 2
P Externen Proceß starten und warten bis beendet? Java Basics - Anfänger-Themen 2
J Threads: warten bis erste aktion ausgeführt wurde Java Basics - Anfänger-Themen 6
G Eine Methode zum Warten? Java Basics - Anfänger-Themen 7
G Frage zum Warten auf und Aufwecken von Threads Java Basics - Anfänger-Themen 2
L Einfaches Warten in eine Schleife Java Basics - Anfänger-Themen 9
B auf mehrere Threads warten Java Basics - Anfänger-Themen 3
K Animation warten lassen Java Basics - Anfänger-Themen 9
S Auf JInternalFrame warten? Java Basics - Anfänger-Themen 2
R Warten, bis ein Prozess gestartet wurde Java Basics - Anfänger-Themen 23
M x Sekunden warten Java Basics - Anfänger-Themen 13
P Bitte um ein paar Tipps! (Threads, Warten auf Ereignisse,.) Java Basics - Anfänger-Themen 2
M Wie lässt man eine Methode warten ohne Threads zu benutzen? Java Basics - Anfänger-Themen 8
Torschti Eingabe von Dezimalzahlen (bis zu zwei Kommastellen) Java Basics - Anfänger-Themen 11
T User input in Verbindung mit ChronoUnit anpassen und falls falsche Eingabe getätigtwird Java Basics - Anfänger-Themen 7
T Eingabe durch eine Zahl dividieren nachgucken? Java Basics - Anfänger-Themen 4
T sortierung der eingabe nach größe Java Basics - Anfänger-Themen 5
Ostkreuz Int Scanner auf Enter Eingabe prüfen Java Basics - Anfänger-Themen 4
G Programm läuft durch, ohne Eingabe aus dem Chat abzuwarten Java Basics - Anfänger-Themen 4
Jul1n4tor Scanner error bei Eingabe die kein Integer ist Java Basics - Anfänger-Themen 4
S Größte Zahl nach Eingabe der Zahl 0 ausgeben Java Basics - Anfänger-Themen 6
M Dialogbox sofort neustarten, falls aktuelle Eingabe falsch Java Basics - Anfänger-Themen 11
M Dialogbox solange abfragen, bis gültige Wert-Eingabe Java Basics - Anfänger-Themen 12
S OOP Java Eingabe in verschiedene Datenbank Tabellen eintragen Java Basics - Anfänger-Themen 7
A Bei VierGewinnt Eingabe per Buchstabe (a,b,c...) Java Basics - Anfänger-Themen 2
java-starter Erste Schritte Eingabe in Char wert umwandeln Java Basics - Anfänger-Themen 7
Lion.King Subtraktion nach Eingabe im Terminal Java Basics - Anfänger-Themen 7
X Erste Schritte Scanner eingabe wird übersprungen Java Basics - Anfänger-Themen 4
L Dauerhaftes Speichern einer Eingabe bei einer ArrayList Java Basics - Anfänger-Themen 26
J In der Ausgabe wird ohne Eingabe in den else Block gesprungen. Java Basics - Anfänger-Themen 0
J In der Ausgabe wird ohne Eingabe in den else Block gesprungen. Java Basics - Anfänger-Themen 5
J Mein Programm läuft bei der ersten Eingabe nicht mehr weiter, woran liegt das? Java Basics - Anfänger-Themen 6
M Eingabe limit Java Basics - Anfänger-Themen 8
brypa Programm mit Eingabe Java Basics - Anfänger-Themen 129
C Potenzberechnung über switch case. Taschenrechner mit Eingabe über einen grafischen Dialog Java Basics - Anfänger-Themen 22
D falsche eingabe erkennen Java Basics - Anfänger-Themen 2
H Eingabe tätigen bevor Graphics g Fenster öffnet Java Basics - Anfänger-Themen 5
H For-Schleife bis Index von Eingabe laufen lassen Java Basics - Anfänger-Themen 24
Hamudi Bachir 2D Array eingabe vom Benutzer Java Basics - Anfänger-Themen 31
S Warum erscheint bei mir "Hallo Welt" und nicht die aktuelle Eingabe? Java Basics - Anfänger-Themen 16
J Jtable Eingabe nach Klick ausserhalb der Tabelle übernehmen Java Basics - Anfänger-Themen 6

Ähnliche Java Themen

Neue Themen


Oben