Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2013
    Messaggi
    78

    Programma inutilizzabile fino alla fine di un ciclo

    Ciao a tutti! Sono davanti a un problema che non sono capace di risolvere da solo:
    sto sviluppando un programma con una GUI semplicissima fatta da due bottoni, una che avvia un ciclo while, l'altro che vorrei lo bloccasse.
    Il fatto è che quando il while è in esecuzione la gui non accetta comandi fino alla fine del ciclo.
    Io nella condizione del while ho messo un controllo su un booleano che se è false non esegue più il ciclo, e sul bottone per stopparlo ho fatto si che il booleno diventi false, ma come dicevo prima il programma non ascolta niente fino alla fine del while. Come posso fare?

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Polly008 Visualizza il messaggio
    sto sviluppando un programma con una GUI semplicissima fatta da due bottoni, una che avvia un ciclo while, l'altro che vorrei lo bloccasse.
    Il fatto è che quando il while è in esecuzione la gui non accetta comandi fino alla fine del ciclo.
    Normale ... perché tutta la gestione della interfaccia utente cioè disegno dei componenti Swing, notifica degli eventi ai listener e altro è fatta in un unico singolo thread chiamato convenzionalmente Event Dispatch Thread. Se tieni tu "impegnato" il EDT in un ciclo o in un Thread.sleep() o altre computazioni pesanti, è chiaro che il framework in quel frangente di tempo non può proseguire con altre operazioni (disegni, eventi, ecc..).

    Le soluzioni sono diverse: se devi fare qualcosa di "temporizzato" ogni tot di tempo e che fa cose brevi/veloci e magari operando sulla interfaccia utente, allora può bastare un timer, intendo javax.swing.Timer .
    Se devi fare cose più lunghe, computazioni pesanti o cose del genere, allora è meglio creare un nuovo thread. Con tutto quello che comporta, cioè devi avere chiaro come definire/avviare il thread, come gestire in modo "cooperativo" la terminazione del tuo thread, come rendere "visibili" le modifiche tra il tuo thread e il EDT, ecc...
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2013
    Messaggi
    78
    Mi sembra di capire che la soluzione per me sia giocare un pò coi thread, di cui so poco niente.
    Non si può semplicemente creare un thread con le operazione che mi servono e n thread con le altre vero?? Sarebbe troppo facile

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Polly008 Visualizza il messaggio
    Mi sembra di capire che la soluzione per me sia giocare un pò coi thread, di cui so poco niente.
    Non si può semplicemente creare un thread con le operazione che mi servono e n thread con le altre vero?? Sarebbe troppo facile
    Che vuol dire "n thread con le altre" ? Da quello che posso capire dal tuo post iniziale, devi fare un lavoro potenzialmente "lungo" e che devi poter fermare. In questo caso questo lavoro è da eseguire in 1 thread a parte .... non N thread.

    Comunque c'è da sapere bene come funziona il multi-threading, sincronizzazione, interazione con il EDT, ecc.... Senza queste basi ti assicuro che non si va molto lontano .... (con i thread intendo ).
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2013
    Messaggi
    78
    n thread con le altre
    era "un thread con le altre", chiedo scusa.

    si il mio ciclo è bello lungo e può tenere impegnato diversi minuti, e volevo con un bottone sulla GUI poterlo fermare.
    Ma se è così complicato mi sa che dovrò rinunciare a questa opzione

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Polly008 Visualizza il messaggio
    si il mio ciclo è bello lungo e può tenere impegnato diversi minuti, e volevo con un bottone sulla GUI poterlo fermare.
    Ma se è così complicato mi sa che dovrò rinunciare a questa opzione
    Ma è quello che andrebbe fatto .... e non è complicatissimo. Richiede però delle "basi" ... che prima o poi ti serviranno comunque se il tuo interesse e di continuare con Java per qualunque cosa di un po' più complesso di una semplice interfaccia GUI.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Utente di HTML.it
    Registrato dal
    Feb 2013
    Messaggi
    78
    rileggendo la prima risposta che mi avevi dato: io in realtà tengo impegnato l'EDT proprio con alcuni Thread.sleep(). Tra questi ci sono instruzioni semplici, non pesanti computazionalmente. Posso sostituire questi "sleep" con Timer dici?

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Polly008 Visualizza il messaggio
    rileggendo la prima risposta che mi avevi dato: io in realtà tengo impegnato l'EDT proprio con alcuni Thread.sleep(). Tra questi ci sono instruzioni semplici, non pesanti computazionalmente. Posso sostituire questi "sleep" con Timer dici?
    Se ci devono essere pause anche più o meno lunghe ma ben cadenzate e il lavoro ogni tot di tempo consiste in operazioni che in tutto sono molto brevi (e possibilmente operano sulla interfaccia utente), allora sì, un javax.swing.Timer va benissimo.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  9. #9
    Utente di HTML.it
    Registrato dal
    Feb 2013
    Messaggi
    78
    Dopo averci ragionato un pò e fatto alcune prove ho deciso che mi butterò sui Thread, grazie!

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.