Eine Schleife mit einer Aktion unterbrechen.

leonard_

Grünschnabel
Hallo erstmal, das Forum hat mir heute abend schon viel weitergeholfen.

Folgendes Problem:

Mein Programm soll auf eine von mir gewählte Festplatte in gewissen zeitabständen zugreifen - egal warum - das geht auch schon im prinzip.

Ich möchte nun mittels eines start knopfs die schleife starten, das geht auch.
dazu habe ich mir eine globale variable boolean run definiert, welche die schleife abbrechen sollte.

es sieht so aus:
run=true;
while (run){
//Festplattenzugriff
}

Ich möchte nun aber mit einem Stop knopf, die schleife jederzeit unterbrechen können.
Es ist mein erstes projekt mit grafischer oberfläche - und ich hab einfach nicht gefunden was ich gesucht habe.

Wenn ich den Start knopf drücke, sollte normal der inaktiv werden und mein stop knopf aktiv. aber sobald ich die schleife drin hab, die ja irgendwie noch eine endlosschleife ist, wird mein stop knopf aber garnie aktiv. obwohl die anweisung ihn zu aktivieren weit über meiner schleife stehen würde.

if(stop.isSelected() == true) {run = false;} das hätte ich z.b. schon ausprobiert. aber wenn ich jetzt eine neue action für Stop mache bzw. er hat schon eine die Stop schickt und dann eigentlich auch schon alles auf den gewünschten zustand setzt krieg ich ja eine neue methode.

es ist mir einfach nicht klar, wie ich das problem lösen soll.

Ich hoffe auf eure Hilfe.
 
Hallo,

gehe ich recht in der Annahme das du für deine "Endlosschleife" keinen
eigenen Thread erzeugt hast ! ?

Der Fehler wird wohl im Code rund um das EventManagement deiner GUI liegen !

Poste mal den Code deiner Listener !

Gruß Jadix
 
Hallo,

ist mein erstes Projekt mit graphischer Oberfläche, erstellt mit Netbeans IDE.
Und soweit ich das sagen kann, habe ich keinen neuen Thread erstellt.

hier die Codestücke:

Code:
    private void startActionPerformed(java.awt.event.ActionEvent evt) {                                      
    if ("Start".equals(evt.getActionCommand())) {
        start.setEnabled(false);
        stop.setEnabled(true);
        
//hier sind dann noch ein paar Ausblende bzw. Einblendeoptionen.


        System.out.println(hdds.toString());
        
        
        System.out.println(run);
        run=true;
        int i = 0;
        while (run){
            i++;
            if(i == 20000) {run=false;} // das hab ich eingebaut damits halt nur abbricht und nicht wirklich eine endlosschleife ist...
            if(stop.isSelected() == true) {run = false;} //das geht ja scheinbar nicht.
            System.out.println(run);
        }

    }
    }

Code:
    private void stopActionPerformed(java.awt.event.ActionEvent evt) {                                     
    if ("Stop".equals(evt.getActionCommand())){
        run = false;
        start.setEnabled(true);
        stop.setEnabled(false);
        
        checkhdds(); // funktion zum Abfragen der Festplatten
    }
    }

Code:
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new KeepdiscaliveGUI().setVisible(true);
            }
        });
    }

Tausend Dank für die Hilfe schonmal!
 
Zuletzt bearbeitet:
Hallo,

so wie ich das sehe, ist das mal wieder der Fehler auf den fast jeder Java-Anfänger
hereinfällt ! Du bist also in guter Gesellschaft ! :)

Durch den Start-Knopf löst du ein Event aus, welches durch den Thread des EventManager
abgewickelt wird. Diesen Thread "fängst" du in deiner Schleife ein !

Damit steht der Thread nicht mehr für die Behandlung weiterer Events zur Verfügung !
Also auch nicht für den Stop-Event !

Lager die Schleife mit dem Fesplattenzugriff in einen eigenen Thread aus, diesen kannst du dann nach belieben aktivieren !

Gruß Jadix
 
Zurück