Visualizzazione dei risultati da 1 a 3 su 3
  1. #1

    [JDK 1.5] Mettere in pausa SwingWorker

    Salve,

    premetto che uso JSE 5 che non aveva inclusa SwingWorker, che ho scaricato dal sito del progetto quindi non so se sia uguale al 100% (ma penso di si) con JSE 6. Detto ciò:

    Allora sto facendo un operazione di test lanciata con SwingWorker. Tutto ok nessun problema mi parte in background l'operazione e siamo tutti felici e contenti.

    Ora,volevo implementare nel JForm che lancia questa applicazione, i classici pulsanti STOP e CONTINUE. Scartabellando per internet l'unica soluzione che sono riuscito ad implementare è quella di inserire nella mia classe una variabile di stop e settare a true/false quella attraverso i pulsanti STOP e CONTINUE. Questo è il risultato:

    codice:
    public class TestTask extends SwingWorker<Void, Void> {
    
        private boolean stopped = false;
    
        @Override
        protected Void doInBackground() throws Exception {
            Random random = new Random();
            int progress = 0;
            //Initialize progress property.
            setProgress(0);
            //Sleep for at least one second to simulate "startup".
            try {
                Thread.sleep(1000 + random.nextInt(2000));
            } catch (InterruptedException ignore) {
            }
            while (progress < 100 && !isCancelled()) {
    
                if (!stopped) { //<------- CONTROLLO CHE NON SIA STATO MESSO IN PAUSA
    
                    //Sleep for up to one second.
                    try {
                        Thread.sleep(random.nextInt(1000));
                    } catch (InterruptedException ignore) {
                    }
                    //Make random progress.
                    progress += random.nextInt(10);
                    setProgress(Math.min(progress, 100));
                }
            }
            return null;
        }
        
        public void pause(){
            stopped=true;
        }
        
        public void restart(){
            stopped=false;
        }
    }
    dove i pulsanti STOP e CONTINUE nella jFrame vanno a richiamare le funzioni pause() e restart() di TestTask

    Mi chiedevo: ma da 1 a 10 fa schifo 100 questa soluzione, oppure è effettivamente un modo affermato di procedere? Avevo pensato ad usare wait() e notify(), solo che non riesco a gestirli perchè se chiamo wait cmq mi blocca tutto quanto (thread principale) e quindi l'applicazione non risponde piu.

    Grazie per gli eventuali consigli
    IP-PBX management: http://www.easypbx.it

    Old account: 2126 messages
    Oldest account: 3559 messages

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    In generale per le questioni relative alla terminazione/sospensione di un thread vedi questo documento (in particolare la sezione "What should I use instead of Thread.suspend and Thread.resume?").
    Quella tecnica che usa, ovvero il wait/notify, è utilizzabile sicuramente anche con SwingWorker.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Grazie per il documento, poi lo leggo con attenzione. Anche perchè poi pensavo di ristrutturare la mia classe e abbandonare SwingWorker, perchè ora ha perso troppo di coerenza


    IP-PBX management: http://www.easypbx.it

    Old account: 2126 messages
    Oldest account: 3559 messages

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.