Hier folgt das Programm, welches Ergebnis der Diskussion war, falls es jemanden interessiert. Vorsicht, bei mir war es tatsächllich so, dass wenn ich das Programm gestartet habe und dann in mein Eclipse gewechselt habe, dort jede Menge "A"-Zeichen in den aktuellen Text "getippt" wurden.
import java.awt.AWTException;
import java.awt.Robot;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;
public class Test {
static boolean pause = true;
public static void main( String[] args ) throws AWTException {
JFrame win = new JFrame();
win.setSize( 100, 100 );
win.setVisible( true );
win.addKeyListener( new KeyListener() {
public void keyPressed( KeyEvent e ) {
if( e.getKeyCode() == KeyEvent.VK_F6 ) {
pause = false;
System.err.println( "ende pause" );
}
else {
if( e.getKeyCode() == KeyEvent.VK_F7 ) {
pause = true;
System.err.println( "start pause" );
}
}
}
public void keyReleased( KeyEvent e ) {
}
public void keyTyped( KeyEvent e ) {
}
} );
Robot robot = new Robot();
while( true ) {
while( !pause ) {
int z = (int) ( Math.random() * 100 ); //zufallszahl zwischen 200 und 300
int u = (int) ( Math.random() * 50 ); //zufallszahl zwischen 50 und 100
robot.delay( z ); //warte z ms
robot.keyPress( KeyEvent.VK_A ); // druecke A
System.out.println( "Press A" );
robot.delay( u ); //warte u ms
robot.keyRelease( KeyEvent.VK_A );// lasse A los
System.out.println( "Release A" );
}
while( pause ) {
try {
Thread.sleep( 1000 );
}
catch( InterruptedException ex ) {
ex.printStackTrace();
}
}
}
}
}
Ciao
Lars
2 Kommentare:
"static boolean pause = true;"
Arghh!!! Im Kontext von Multithreading sieht das einfach haarsträubend aus! Auf einer Maschine mit mehreren Prozessorkernen besteht durchaus eine gewisse Wahrscheinlichkeit, dass trotz Tastendruck absolut nichts passiert.
Das ist nämlich ein Paradebeispiel für den Fall, wo man den Modifier "volatile" benutzen sollte, sonst muss der zweite Thread gar nicht mitkriegen, dass die Variable sich geändert hat.
Wenn dich das Thema interessiert, lies etwas über das Java Memory Model. ;)
Danke für den Hinweis. Das hat mich mal dazu gebracht "volatile" näher zu betrachten.
Kommentar veröffentlichen