Threads Klicks pro Sekunde parallel zum Programm bekommen

DaCrazyJavaExpert

DaCrazyJavaExpert

Bekanntes Mitglied
Hey,
in meinem CookieClicker möchte ich ein "Klicks pro Sekunde" Feature einbauen, also ein Feature welches die Klicks auf meinem Cookie innerhalb einer Sekunde zählt und die dann wiedergibt. Da das parallel zum Programm laufen soll, dachte ich mir ich löse das mit Threads. In meinem Thread prüfe ich ein boolean, welcher festlegt wann der Thread gestartet werden darf und wann nicht, wenn ich auf meinem Cookie klicke. Ich warte im thread dann eine Sekunde, während ich in dieser Sekunde bei jedem Klick einer Zählervariable eins dazuzähle. Nach Ablauf der Sekunde soll der Wert der Variable genommen werden un vorerst auf der Konsole ausgegeben werden.
So sieht mein Code bisher aus:
Java:
//Die Thread Klasse
public class CPSThread extends Thread {
 
    private CookieClickerGUI cps; //Inztanz der HauptGUI-Klasse
 
    public CPSThread(CookieClickerGUI cps) {
        this.cps = cps;
    }
 
    @Override
    public void run() {
        cps.setCpsBoolean(false); //boolean welcher prüft ob der Thread gestartet werden darf
        try {
            sleep(1000);
        } catch (InterruptedException e) {
            System.err.println("Error while sleeping.");
            e.printStackTrace();
        }
        cps.setCpsBoolean(true);
        System.out.println(cps.getClicksPerSecond());
        cps.setClicksPerSecond(0);
    }

}

Hier die implementierung in der Hauptklasse(in einem MouseListener):
Java:
    private int clicksPerSecond;
    private boolean cpsBoolean;
//dies hier im Listener:
                clicksPerSecond++; //Bei jedem Klick auf den Cookie zählt sie Variable um 1 hoch.
                if(cpsBoolean == true) { //Nur wenn der Boolean true ist soll der Thread beim Klick auf den Cookie ausgeführt werden.
                    cpsThread.start(); 
                }
Ich hab dann noch in der regulären Klasse die Thread Klasse instanziert:
Java:
CPSThread cpsThread = new CPSThread(this);
Mein Problem ist jetzt, dass nach der einen Sekunde zwar die Klicks in dieser Sekunde in der Konsole angezeigt werden, dann allerdings eine Exception auftritt (IllegalThreadStateException). Muss ich den Thread irgenwie noch nach dem durchlaufen abbrechen?
Oder gibt es noch eine sinnvollere Möglichkeit die Klicks pro Sekunde parallel zum eigentlichen Programm abzufragen? Ich weiß dass das Momentan vom Prinzip her ziemlich schlecht ist wie ich versuche die CPS zu bekommen, aber dass würde ich dann später noch optimieren, wenn ich mir sicher bin, dass das mit dem Thread klappt.

Vielen Dank für Hilfe
LG M.V.
 
J

Joose

Top Contributor
Man leitet nicht von Thread ab sondern implementiert das Runnable Interface. Da du nicht das Verhalten der Thread Klasse anpassen willst sondern nur implementieren willst was beim Ablauf des Threads passieren soll.
Du startest jedes mal dasselbe Thread Objekt, daher auch deine Exception. Du müsstest jedesmal ein neues Objekt erstellen.
Alternative: Starte den Thread 1x beim ersten Klick und lasse ihn endlos laufen. Wenn keine Klicks registriert werden (clicksPerSecond == 0) dann gib nichts aus, ansonsten gib sie einfach aus.
Achtung: verwende kein while(true) um den Thread endlos laufen zu lassen!

Beispiel:
Java:
public class CPSThread implements Runnable {
   private boolean running = true;
    private CookieClickerGUI cps;
    public CPSThread(CookieClickerGUI cps) {
        this.cps = cps;
    }
   
   public void stop() {
       this.running = false;
   }
   
    @Override
    public void run() {
       // einmal am anfang sagen, dass der Thread gestartet ist
       cps.setCpsBoolean(false); //boolean welcher prüft ob der Thread gestartet werden darf
       while(running) {
           try {
               sleep(1000);
           } catch (InterruptedException e) {
               System.err.println("Error while sleeping.");
               e.printStackTrace();
           }
           int clicks = cps.getClicksPerSecond();
           if(clicks > 0) {
               System.out.println(clicks);
           }
           cps.setClicksPerSecond(0);       
       }
       // am Ende sagen, dass er gestoppt wurde
        cps.setCpsBoolean(true);
    }
}
 
DaCrazyJavaExpert

DaCrazyJavaExpert

Bekanntes Mitglied
Ok ich hab es jetzt nicht genauso gemacht wie du es beschrieben hast, aber so ähnlich. Zu Beginn habe ich noch eine Frage:
Java:
public void stop() {
       this.running = false;
   }
Brauche ich diese Methode denn dann eigentlich? Oder ist sie einfach da um running zu initialisieren?
Stoppen muss ich den Thread eigentlich nie. Ich will ja dauerhaft die Klicks abfangen. Oder verstehe ich da irgendwas falsch?

Auf jeden Fall passiert momentan gar nichts. Es wird nichts ausgegeben bei meinem jetztzigen Code:
Java:
public class CPSThread implements Runnable {

    private CookieClickerGUI cps;
    private boolean running;

    public CPSThread(CookieClickerGUI cps) {
        this.cps = cps;
    }

    private void stop() { // ?
        this.running = false;
    }

    @Override
    public void run() {
        cps.setCpsBoolean(false); // Damit Thread nicht bei jedem Klick aufgerufen wird
        while (running) { //Schleife
            try {
                Thread.sleep(1000); //Eine Sekunde schlafen...
            } catch (InterruptedException e) {
                System.err.println("Error while sleeping.");
                e.printStackTrace();
            }
            if (cps.getClicksPerSecond() > 0) { //...und dann, falls "clicksProSekunde > 0 ist...
                System.out.println(cps.getClicksPerSecond()); //...Momentanen Wert von KlicksProSekunde ausgeben
                cps.setClicksPerSecond(0); // und Variablenwert wieder auf 0 setzen
            }
        }

    }
}
Vielleicht liegt mein Problem aber auch beim starten des Threads:
Java:
//Dies hier in der regulären GUI Klasse:
Thread cpsThread = new Thread (new CPSThread(this));
//Dies hier im Listener:
clicksPerSecond++;
                if(cpsBoolean == true) {
                    cpsThread.start();
                }

Tut mir Leid, falls das hier ein ganz banaler Fheler ist. Ich arbeite das erste mal mit Threads.
Vielen Dank
 
DaCrazyJavaExpert

DaCrazyJavaExpert

Bekanntes Mitglied
Ich sehe nicht dass running mal auf true gesetzt wird ?
Oh Danke :rolleyes:. Das hätte mir eigentlich auffallen müssen. Ich dachte irgendwie so halb, dass true der Standert-Wert eines Booleans ist, weshalb ich darauf gar nicht gekommen bin. Ein Fehler, der nicht wegen meiner nicht vorhandener Kenntnisse im Thema Threads entstanden ist :confused:.
Ok das wars dann. Vielen Dank.
 
J

Joose

Top Contributor
Ok ich hab es jetzt nicht genauso gemacht wie du es beschrieben hast, aber so ähnlich. Zu Beginn habe ich noch eine Frage:
Java:
public void stop() {
       this.running = false;
   }
Sauber Programmierung ;)
Bevor dein Programm endet sollte man natürlich auch alle Threads enden lassen.
Ja man kann einfach mit System.exit(0); alles beenden, was ich aber eben unsauber finde.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
H MouseListener klicks begrenzen Java Basics - Anfänger-Themen 4
D ActionListener braucht zwei Klicks auf Button??? Java Basics - Anfänger-Themen 2
T Begrenzte Anzahl von Klicks Java Basics - Anfänger-Themen 3
M ActionListener: Ort des Klicks? Java Basics - Anfänger-Themen 2
U Farbe meines Würfels jede sekunde ändern! Java Basics - Anfänger-Themen 5
W Erste Schritte Timer soll jede Sekunde Label aktualisieren Java Basics - Anfänger-Themen 5
R JLabel imageicon jede Sekunde wechseln Java Basics - Anfänger-Themen 3
J Algorithmus: Grad von floating zu Grad/Minute/Sekunde Java Basics - Anfänger-Themen 3
J Eine int Variable jede Sekunde um 1 hocnzählen Java Basics - Anfänger-Themen 3
O Halbe Sekunde für bild.getScaledInstance() ? Java Basics - Anfänger-Themen 2
1 OOP Zugriff auf eine Methode nur einmal die Sekunde Java Basics - Anfänger-Themen 8
T eine Sekunde warten Java Basics - Anfänger-Themen 11
M Zeit zurückgeben je sekunde Java Basics - Anfänger-Themen 8
U Jede Sekunde Java Basics - Anfänger-Themen 6
M Mehre Dateien parallel kopieren mit Multithreading Java Basics - Anfänger-Themen 8
T Parallel ausführen Java Basics - Anfänger-Themen 1
I Threads Matrixmultiplikation parallel Java Basics - Anfänger-Themen 6
D main-Methode und Tread parallel ausführen Java Basics - Anfänger-Themen 0
B Threads parallel zur main Java Basics - Anfänger-Themen 3
J Können mehere Threads parallel eine Datei lesen? Java Basics - Anfänger-Themen 4
B JDK installieren Mehrere JDKs parallel Java Basics - Anfänger-Themen 3
P Threads Wann läuft es parallel ab ? Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Anzeige

Neue Themen


Oben