Thread - sleep - interrupt

Status
Nicht offen für weitere Antworten.

Ripei

Mitglied
N Abnd....

Ich bin ein ziemlicher Java-Neuling.
Ich versuche momentan ein Programm zu programmieren wo eine Grafik vom linken zum rechten Bildschirmrand "wandert". Und man steuert einen Punkt. (Manche kennen das Spiel vllt. unter dem Namen Frogger)
Dazu habe ich in ein JPanel einen Thread implementiert.
Prinzipiell läuft das Programm.

Jedoch jedesmal wenn ich den Punkt mit der Tastatur steuere, dann wird mir eine Fehlermeldung angezeigt;

java.lang.InterruptedException: sleep interrupted
at java.lang.Thread.sleep(Native Method)


Logischerweise muss ich den Thread ja auch irgendwann mal schlafen(sleep)en lassen.
Während ich den Punkt mit der Tastatur steuere, muss ich den Thread aber mittels t.interrupt(); unterbrechen, da ich den Punkt sonst nicht steuern kann.
Das Problem liegt jetzt darin, dass ich den Thread auch unterbreche wenn er schlaft. Was ja eigentlich sinnlos ist.

Meine Frage; kann ich während der Thread schläft, eine Boolean true setzen und während diese Boolean true ist, interrupte ich dann einfach nicht.
Oder hat irgendwer einen anderen besseren Lösungsweg?

Danke für eure Antworten.
mfg Ripei
 
Warum muss der Thread unterbrochen sein um den Punkt zu steuern? Ich kenne mich mit Thread-Programmierung nicht besonders gut aus. Aber der Sinn sollte doch sein, dass die Steuerung in einem Thread läuft und die Grafikberechnung und beider nebenläufi funktioniert. Oder habe ich etwas falsch verstanden?
 
Sry.
Ich hab mich vllt. nicht ganz klar ausgedrückt;
Die Steuerung des Punktes läuft nicht in einem Thread, in einem Thread läuft nur das Bild (in meinem Fall ein Auto).
Die Steuerung des Punktes hab ich einfach mit dem Event FormKeyPressed gelöst. Das Problem ist, dass anscheinden der Thread, wenn er einmal läuft, mehr "zu sagen hat" als die Punkt-Steuerung. Deshalb das interrupt, dann steuere ich den Punkt (z.B. posX + 10) und lass den Thread wieder weiterlaufen.
 
hmm... ich versteh dein Problem.. leider kenn ich mich zuwenig aus um dir helfen zu können.
 
Während ich den Punkt mit der Tastatur steuere, muss ich den Thread aber mittels t.interrupt(); unterbrechen, da ich den Punkt sonst nicht steuern kann.
Warum?
Du baust da vermutlich etwas sehr seltsames.
Hast du dir die Zeit genommen dich in das Thema einzulesen bevor du anfängst verrückte Dinge zu programmieren? ???:L
 
Sagen wir so; ich hab nach verschiedenen Lösungsmöglichkeiten gesucht und nur diese gefunden.
Und dass mein Code bzw. mein Lösungsweg wahrscheinlich nicht wirklich "professionell" ist das ist mir bewusst, aber ich bin wie gesagt noch ein Java-Neuling.
 
Ich hab schon viele Lösungen gesehen, eine mit interrupt war noch nie dabei.
Entweder du zeigst deinen Code (bitte auf das wesentliche reduziert), oder du gehst bekannte Pfade.
 
Ok.. hier ist der Code. Wahrscheinlich werden jetzt mind. 5 Leuten die Augen ausfallen wenn sie ihn sehen, aber wie gesagt, ich bin ein Neuling.

Code:
public void run(){
        while( true){
            try {
                
                posXA1 += 10;
                posXA2 += 20;
                posXA3 += -10;
                posXA4 += -20;
                if(posXA1 >= 655){
                    posXA1 = 0;
                }if(posXA2 >= 655){
                    posXA2 = 0;
                }if(posXA3 <= 0){
                    posXA3 = 655;
                }if(posXA4 <= 0){
                    posXA4 = 655;
                }
                
                koordinatenCheck1(posX, posY, posXA1, posYA1);
                koordinatenCheck2(posX, posY, posXA2, posYA2);
                koordinatenCheck3(posX, posY, posXA3, posYA3);
                koordinatenCheck4(posX, posY, posXA4, posYA4);
                
                t.sleep(100);
                repaint();
            } catch (InterruptedException ex) {
                ex.printStackTrace();
            }
        }
    }

In paintComponent lasse ich dann einfach die Autos zeichnen.
Code:
private void formKeyPressed(java.awt.event.KeyEvent evt) {                                
        Graphics g = this.getGraphics();
        boolean test = t.isAlive();
        t.interrupt();
        switch(evt.getKeyCode()){
            case KeyEvent.VK_RIGHT:{
                if(posX >=500){
                    posX = posX;
                }else{
                    posX += 10;    // posX = posX + 10;
                }
                
                repaint();
                break;
            }
            case KeyEvent.VK_LEFT:{
                if( posX <= 0){
                    posX = posX;
                }else{
                    posX -= 10;
                }
                repaint();
                break;
            }
            case KeyEvent.VK_UP:{
                if(posY <= 40){
                    int retVal = JOptionPane.showConfirmDialog(null, "Sie haben es geschafft, erneut versuchen?");
                    if( retVal == JOptionPane.YES_OPTION){
                        posX = 300;
                        posY = 370;
                    }if(retVal == JOptionPane.NO_OPTION){
                        System.exit(0);
                    }
                }else{
                    posY -= 10;
                }
                
                repaint();
                break;
            }
            case KeyEvent.VK_DOWN:{
                if(posY >= 370){
                    posY = posY;
                }else{
                    posY += 10;
                }
                
                repaint();
                break;
            }
            
        }
        t.start();

Ok... das ist der Wichtigste Teil des Programms.
Vllt. Versteht ihr jetzt mein Problem. [/code]
 
Sry. Ich habe gereade gesehen, dass bei dem 2. Codetext in der 4 Zeile steht:

boolean test = t.isAlive();

Das gehört eigentlich nicht hinein, das war ein Versuch von mir, den ich eigentlich raustun wollte.
 
Ich erklär euch mal wie ich das Programm aufgebaut habe;

Zuerst habe ich einfach einen Punkt gezeichnet und probiert ihn zu steuern.
Als ich das realisiert hatte, habe ich einen weitern Punkt gezeichnet. Dieser war mein Thread, er sollte von links nach rechts wandern.
Also ich das auch geschafft hatte, und austeste ob es jetzt funktioniert, lief der Thread so wie er sollte. Jedoch konnte plötzlich meinen Punkt nicht mehr steuern. D.h. während der Thread läuft, hatten die anderen Sachen nichts zu sagen.
Deshalb unterbreche ich den Thread und steuere dann meinen Punkt, anschließend nachdem ich den Punkt gesteuert habe lass ich den Thread mit t.start(); weiterlaufen.
 
Ripei hat gesagt.:
Also ich das auch geschafft hatte, und austeste ob es jetzt funktioniert, lief der Thread so wie er sollte. Jedoch konnte plötzlich meinen Punkt nicht mehr steuern. D.h. während der Thread läuft, hatten die anderen Sachen nichts zu sagen.
Dann musst du einen Fehler gemacht haben. Threads sind pseudo-parallel.
Ich denke nicht das es sehr sinnvoll ist deinen aktuellen Ansatz weiter zu verfolgen.
 
Ich habe es jetzt noch mal ohne Interrupt probiert und ich habe gesehen, dass ich es vorher genau falsch erklärt habe. Weil wenn ich interrupt raustue, dann kann ich den Punkt steuern aber der Thread läuft nicht mehr.
Also genau umgekehrt wie ich vorher gesagt habe.
 
Das gibt keinen Sinn. Du sagst gerade:
Wenn du einen Thread nicht unterbrichst, läuft er nicht. :autsch:
Ich glaube dein Code ist seriously broken.
Tu's als Erfahrung ab und fang neu an.
 
tja... es ist aber so...ich kanns mir auch nicht erklären
hmm... schade...dabei ist es ja im prinzip schon gelaufen und ich wollte nur noch
dieses Problem lösen, dann wäre ich mit dem Programm endgülitig fertig gewesen.
 
ich hab eine Frage:
Weil ich das mit dieser Lösungsvariante doch noch nicht aufgeben will, hab ich mich nochmal ein bisschen in Threads hineingelesen. Ich bin auch auf die Methode Thread.getState() gekommen.
Meine Frage; ich könnte jetzt ja im Prinzip herausfinden, in welchem Status sich der Thread momentan befindet.
Nur wie schreibe ich das als JavaCode? Ich stell mir das so vor; wenn der Thread schläft, dann soll er in einer if schleife den Thread nicht interrupten. Wenn er nicht schläft dann schon.
 
prinzipiell müsste das ja irgendwie so gehen...

if(thread.getState() = *** ){

>> hier halt dann der code zum steuern des punktes <<

}else{

thread.interrupt();
>>hier halt dann der code zum steuern des punktes <<
thread.start();

}

ich weiß jetzt nicht was ich oben bei den *** reinschreiben soll.
Da müsste dann halt stehen wenn der Status den er bekommt gleich dem Status sleep ist, dann soll er eben das tun
was in der if schleige steht.
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben