# Programm per Tastendruck beenden



## rom4o (3. Apr 2008)

Hallo Leute, ich habe hier ein Programm,
das ich per Tastendruck, egal welche Taste, beenden möchte.
Die Variante, Taste drücken und anschließend return, kenne ich.
Möchte aber das Programm ohne anschließendes return beenden.
Ich habe schon die anderen Beiträge, im Forum, dazu gelesen, das Problem *wurde nicht gelöst*.
*Es wurde behauptet, dass dies in reinen Konsolenanwendungen nicht möglich sei, kann ich aber nicht glauben.*

*Also hier mein Programm:*

```
public class ThreadTest {
	static final int LIMIT = 201;
	public static void main(String[]args){
		Thread ta = new ThreadA();
		Thread tb = new ThreadB();
		ta.start();
		tb.start();
		System.out.println("   DONE...");		
	} //main	
} //end of class ThreadTest

/////

class ThreadA extends Thread{
	public void run(){
		for(int i=1;i<ThreadTest.LIMIT;i++){
			
			try{
				sleep(40); //schlafe 40ms
			}catch(InterruptedException e){}
			
			System.out.println("A: " + i);
		} //for
	System.out.println("A done");
	} //run
} //end of class ThreadA

class ThreadB extends Thread{
	public void run(){
		for(int i=-1;i>-ThreadTest.LIMIT;i--){
			
			try{
				sleep(20); //schlafe 20ms
			}catch(InterruptedException e){}
			
			System.out.println("     B: " + i);
		} //for
	System.out.println("     B done");
	} //run
} //end of class ThreadB
```

I*ch habe mir gedacht, vielleicht einen eigenen Thread schreiben der eine Eingabe verarbeitet, und dementsprechend
reagiert.
Aber ich weiss nicht wie????

Bin euch sehr dankbar für Ratschläge.

Grüsse rom4o*


----------



## Niki (3. Apr 2008)

Hier sind einige Leute im Forum die wirklich Ahnung haben von dem was sie schreiben. Wenn sie sagen es geht nicht, dann würd ich ihnen einfach glauben und eine andere Lösung suchen.
Soweit ich weß geht es nicht, du bekommst die Eingabe erst nach einem Enter mit.


----------



## Wildcard (3. Apr 2008)

Das geht nur wenn du nativen Code einbindest.


----------



## rom4o (3. Apr 2008)

Ich bezweifle überhaupt nicht, dass die Leute hier Ahnung haben,
aber für dieses auf den ersten Blick simpel erscheinende Problem
kann ich einfach nicht glauben, dass es da keine Lösung gibt.

Wie sieht denn nativer Code in Java aus?

Danke für die Antworten bisher


----------



## foobar (3. Apr 2008)

> Wie sieht denn nativer Code in Java aus?


Das geht nur per JNI


----------



## Wildcard (3. Apr 2008)

rom4o hat gesagt.:
			
		

> Ich bezweifle überhaupt nicht, dass die Leute hier Ahnung haben,
> aber für dieses auf den ersten Blick simpel erscheinende Problem
> kann ich einfach nicht glauben, dass es da keine Lösung gibt.


Den Tastaturpuffer anzuzapfen ist so simple nicht. Besonders nicht, wenn du das Plattformunabhängig haben möchtest.


----------



## rom4o (3. Apr 2008)

Hallo verstehe, es ist also eigentlich nicht möglich.
Ich möchte das schon plattformunabhängig haben, und habe auch keine
Lust nur für diese Problem jetzt eine ganz ander Programmiertechnik zu erlernen.
Gibt es nicht irgend eine Methode die als Eingabe ein Char erwartet und dann
sofort etwas beliebiges ausführt?
Das wäre doch dann "schon" die Lösung.

 :roll:


----------



## Illuvatar (3. Apr 2008)

In einer reinen Konsolenanwendung bist du darauf reduziert was dir Java anbietet dass du mit der Konsole machen kannst. Du kannst mit Java nur Sachen lesen wenn Enter gedrückt wird. Alles weitere geht also logischerweise nur per JNI. Punkt.

(Vielleicht hat das ja schonmal jemand per JNI gemacht - da könntest du mal Sourceforge durchsuchen)


----------



## foobar (3. Apr 2008)

Das Problem ist, daß die InputStreams blocken d.h. du kannst erst Daten daraus lesen, wenn etwas verfügbar ist. Ohne nativen Code wirste das Problem nicht lösen können. Guck dir mal Den System.in Stream an. 
Wofür brauchste das überhaupt?


----------



## rom4o (3. Apr 2008)

Tja nagut ich gebs auf.
Warum stellt auch Java solch eine Routine nicht zur Verfügung.
Naja...danke für die Antworten.



> Wofür brauchste das überhaupt?


Siehe Anfang.
Und auf Punktkommentare kann ich gern verzichten, ist dann ne tolle Hilfe.

rom4o


----------



## foobar (4. Apr 2008)

rom4o hat gesagt.:
			
		

> Tja nagut ich gebs auf.
> Warum stellt auch Java solch eine Routine nicht zur Verfügung.
> Naja...danke für die Antworten.
> 
> ...



Wenn es unbedingt eine Konsolenanwendung sein muß hilft dir vielleicht sowas weiter: http://sourceforge.net/projects/javacurses/


----------



## quippy (4. Apr 2008)

rom4o hat gesagt.:
			
		

> Warum stellt auch Java solch eine Routine nicht zur Verfügung.



Die Frage kann wohl nur SUN wirklich beantworten. Aber um es vielleicht deutlicher zu machen: das Einlesen einer Taste ist vor allem schon mal sehr Hardwareabhängig. Auf PCs (egal, ob Linux oder Windows) wird am Port 0x60 der Make- und Brake-Code einer gedrückten bzw. losgelassenen Taste angelegt.

Mit dem Bios-Interrupt 0x16 kann man diesen Port ebenfalls auslesen, bzw. dort wird der Hardware-Tastaturpuffer (der als Ringpuffer an die 16 Zeichen (oder so) aufnehmen kann) ausgelesen - man bekommt nur den ASCII-Code der Taste oder alternativ den Status der Modifizierertasten (Shift, CTRL, ALT...) 
Hier steht dazu was.

Dies deutet an, daß das Auslesen eines Tastendrucks in erster Linie sehr Hardwarelastig ist. Das bedeutet weiter, daß Java hier auf die OS-Schicht gehen muss, um portabel zu bleiben. Unter Windows >98 (ME) z.B. dürfte Java den Port gar nicht mehr selbst lesen oder den BIOS-Interrupt aufrufen. Das wird unter Linux das gleiche Problem sein - von anderen UNIXen oder SUN OS ganz zu schweigen!

Ergo: es bleibt nur der InputStream an stdin, der auf jedem OS geliefert wird, der leider aber erst dann "flushed", wenn man "enter" gedrückt hat.


----------



## rom4o (4. Apr 2008)

@foobar: Danke für die Seite, wenn ich mal mehr Zeit habe werde ich mich damit näher beschäftigen.
@quippy: Sehr schöne Erklärung, so kann man das gut verstehen, woher weisst du das denn?
An sich stört es ja nicht wenn das Programm in diesem Punkt hardwarenah wird denn ich geh mal davon aus,
dass heut zu Tage jeder PC eine Tastatur hat, und das Programm soll ja nur für standart PC´s sein, nicht für Handys oder irgendwelche SubPC-Systeme. 

Aber ich habe wie gesagt keinen Plan wie man JNI benutzt, hab mir
mal was dazu durchgelesen und musste feststellen, dass mir zu kompliziert ist.
Aber vielleicht hat ja jemand das Problem damit schon mal gelöst, dann kann er es ja hier posten   .

danke

rom4o


----------



## quippy (4. Apr 2008)

rom4o hat gesagt.:
			
		

> @quippy: Sehr schöne Erklärung, so kann man das gut verstehen, woher weisst du das denn?



Nun, ich bin schon etwa 23 Jahre in der Softwareentwicklung tätig und damals, vor Java, hat man auch in C oder Assembler programmiert. Damals war "PC Intern" von Michael Tischer _das_ Buch für den ambitionierten Coder mit vielen Beispielen in Pascal (Borland Turbo Pascal), C (Borland Turbo C) und Assembler (TASM).
Und wenn man sich dann mal einen eigenen Tastaturtreiber geschrieben hat, dann kann man sich da manchmal noch dran erinnern.



			
				rom4o hat gesagt.:
			
		

> An sich stört es ja nicht wenn das Programm in diesem Punkt hardwarenah wird denn ich geh mal davon aus,
> dass heut zu Tage jeder PC eine Tastatur hat, und das Programm soll ja nur für standart PC´s sein, nicht für Handys oder irgendwelche SubPC-Systeme.



Das ist zwar richtig, aber ich bezweifle mal, daß ein *alter* Mac das genauso macht, wie ein PC - oder ein AMIGA  oder eine SUN Workstation oder was da sonst noch so 'rumfliegt. Ich spreche ja von einer Systemarchitektur, die im alten XT bereits eingesetzt wurde.

Ich bezweifle auch mal, daß eine SUN eine A20 Datenleitung kennt, die man erst öffnen muss, um an den Speicher jenseits der 640 K ran zu kommen


----------



## Wildcard (4. Apr 2008)

rom4o hat gesagt.:
			
		

> An sich stört es ja nicht wenn das Programm in diesem Punkt hardwarenah wird denn ich geh mal davon aus,
> dass heut zu Tage jeder PC eine Tastatur hat, und das Programm soll ja nur für standart PC´s sein, nicht für Handys oder irgendwelche SubPC-Systeme.


Es geht lediglich darum, das der Aufwand das für alle Plattformen zu implementieren bei weitem den Nutzen übersteigt.
Dieses Feature braucht kein Mensch. Wenn du eine echte 'Konsolen GUI' schreiben willst, dann JCurses, aber wenn es darum geht ob da jetzt steht 'beliebige Taste zum Beenden drücken', oder 'zum Beenden Enter drücken', dann sagen SUN und ich das gleiche:
Scheiß drauf


----------



## rom4o (6. Apr 2008)

Leider wurde wohl nicht genau verstanden, dass
es dabei nicht um Nutzen oder Sinn sondern Machbarkeit geht.


----------



## Illuvatar (6. Apr 2008)

_Um mich mal auf dein Niveau herabzulassen_

Du scheinst hier der zu sein, der es nicht schnallt:
Es ist in reinem Java nicht machbar, nur per JNI, wenn du das schaffen willst wirst du dich wohl erstmal einige Tage einarbeiten müssen, wenn das plattformunabhängig sein soll, wirds noch viel komplizierter.
Das ist alles was es dazu zu sagen gibt, daran kannst du nichts ändern wenn du hier noch länger rumnölst. Wenn du versuchst das selber zu implementieren, stell eine konkrete Frage, da wird dir sicher geholfen.
Was wir versuchen dir mitzuteilen ist, dass es nicht viel Sinn hat. Es geht immer um den Sinn, warum sollten wir über etwas sinnloses reden? Wenn du dir selber in Awt/Swing eine Konsolen-UI schreibst und die Streams darauf umleitest, ist das hundertmal einfacher als da was mit der Konsole zu machen, auf die du keinen Einfluss hast.


----------



## Guest (6. Apr 2008)

Manoman ihr geht ja ganzschön aggressiv miteinander um.
Das geht doch auch anders


----------



## Gast (5. Mai 2008)

i finds auch lustig  
in anderen foren müsst es auch ma so zugehen


----------



## Quaxli (5. Mai 2008)

Ich find's o.k. - irgendwann ist die Geduld halt am Ende.


----------

