Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2010
    Messaggi
    14

    [Java] Lanciare Thread da Interfaccia grafica senza bloccare quest'ultima

    Ho un piccolo problema con un mio programma in java, sembrava un problema stupido ma mi sono reso conto di non sapere come risolverlo.
    Il problema è:

    Ho una classe finestra, che estende JFrame, contenente all'interno un singolo JButton con ascoltatore annesso, all'interno del metodo ascoltatore, che viene richiamato in seguito alla pressione del JButton, creo un nuovo Thread e lo faccio partire.
    Il thread non fa altro che eseguire un ciclo infinito di stampa a video.

    Ora, essendo il thread, appunto, un thread separato, dovrebbe proseguire con il suo ciclo infinito lasciando la mia interfaccia grafica libera da qualsiasi compito, e disponibile ad essere usata, invece non appena premo il pulsante, parte il ciclo infinito, ma nonostante sia su un altro thread mi causa il blocco totale dell'applicazione fino a ciclo terminato (cioè mai).

    Non so dove stia l'errore, il nuovo thread dovrebbe essere indipendente, invece a conti fatti è come se interfaccia grafica e ciclo condividessero lo stesso thread.
    Grazie in anticipo nel caso a qualcuno venga qualche idea.

  2. #2
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    502

    Re: [Java] Lanciare Thread da Interfaccia grafica senza bloccare quest'ultima

    Originariamente inviato da Pharanoise
    Ho un piccolo problema con un mio programma in java, sembrava un problema stupido ma mi sono reso conto di non sapere come risolverlo.
    Il problema è:

    Ho una classe finestra, che estende JFrame, contenente all'interno un singolo JButton con ascoltatore annesso, all'interno del metodo ascoltatore, che viene richiamato in seguito alla pressione del JButton, creo un nuovo Thread e lo faccio partire.
    Il thread non fa altro che eseguire un ciclo infinito di stampa a video.

    Ora, essendo il thread, appunto, un thread separato, dovrebbe proseguire con il suo ciclo infinito lasciando la mia interfaccia grafica libera da qualsiasi compito, e disponibile ad essere usata, invece non appena premo il pulsante, parte il ciclo infinito, ma nonostante sia su un altro thread mi causa il blocco totale dell'applicazione fino a ciclo terminato (cioè mai).

    Non so dove stia l'errore, il nuovo thread dovrebbe essere indipendente, invece a conti fatti è come se interfaccia grafica e ciclo condividessero lo stesso thread.
    Grazie in anticipo nel caso a qualcuno venga qualche idea.
    Cerca sul forum i termini EDT, invokeLater, SwingUtilities e vedrai che usciranno post che ti spiegano come fare.
    al volante son nervoso

  3. #3
    Utente di HTML.it
    Registrato dal
    Mar 2010
    Messaggi
    14
    Ok evidentemente era un problema molto comune...
    In ogni caso ho risolto, nel caso in cui qualcuno abbia il mio stesso problema:

    Guida alla concorrenza in swing

    Invece di estendere il thread dalla classe Thread mi è bastato estenderlo dalla classe SwingWorker, e sostituire il metodo run() con il metodo doInBackground() e si è risolto tutto...

    Scusate per il doppion e grazie lo stesso

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Pharanoise
    Ora, essendo il thread, appunto, un thread separato, dovrebbe proseguire con il suo ciclo infinito lasciando la mia interfaccia grafica libera da qualsiasi compito, e disponibile ad essere usata, invece non appena premo il pulsante, parte il ciclo infinito, ma nonostante sia su un altro thread mi causa il blocco totale dell'applicazione fino a ciclo terminato (cioè mai).
    Fammi indovinare .... hai invocato tu esplicitamente il run()?

    Originariamente inviato da Pharanoise
    Invece di estendere il thread dalla classe Thread mi è bastato estenderlo dalla classe SwingWorker, e sostituire il metodo run() con il metodo doInBackground() e si è risolto tutto...
    Guarda che non si è obbligati ad usare SwingWorker (che tra l'altro è di "serie" solo da Java 6). SwingWorker offre effettivamente delle facilitazioni per poter aggiornare la interfaccia utente in modo da non doversi preoccupare più di tanto del passaggio al EDT, necessario per aggiornare la interfaccia.

    Ma non c'è nulla che non si possa fare con un Thread "normale".
    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
    Mar 2010
    Messaggi
    14
    Originariamente inviato da andbin
    Fammi indovinare .... hai invocato tu esplicitamente il run()?
    Il metodo actionPerformed() istanziava il Thread e invocava il suo metodo run(), (Personalmente per quanto ho appreso fin'ora altri modi di far partire un thread oltre che invocarlo direttamente non li conosco)

    Ma non c'è nulla che non si possa fare con un Thread "normale".
    Per potersi fare si può fare, però lancio un Thread "normale" dal metodo actionPerformed che viene chiamato dalla pressione del tasto, e questo thread svolge un compito abbastanza lungo, l'interfaccia grafica mi rimane non reattiva, in stallo, fino alla fine dell'esecuzione ( che nel caso di un server non termina mai )

    Il tutto funziona alla grande finchè lavoro via console, ma quando uso l'interfaccia grafica, l'uso di un Thread normale mi provoca lo stallo dell'intera interfaccia, fino a thread concluso...
    Probabilmente c'è qualche aspetto dei Thread che mi sfugge.

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Pharanoise
    Il metodo actionPerformed() istanziava il Thread e invocava il suo metodo run()
    Appunto!! (e ho indovinato .... altro che sfera di cristallo!! ) Non sei tu che devi invocare il run()!! Se lo invochi tu .... è come la invocazione di un qualunque altro metodo, lo fai in modo "sincrono" nel thread corrente, no?

    Devi istanziare il thread e invocare il suo start(). Tutto qui. Sarà la JVM ad invocare il run() nel contesto di un nuovo "thread di esecuzione".
    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
    Mar 2010
    Messaggi
    14
    Originariamente inviato da andbin
    Appunto!! (e ho indovinato .... altro che sfera di cristallo!! ) Non sei tu che devi invocare il run()!! Se lo invochi tu .... è come la invocazione di un qualunque altro metodo, lo fai in modo "sincrono" nel thread corrente, no?

    Devi istanziare il thread e invocare il suo start(). Tutto qui. Sarà la JVM ad invocare il run() nel contesto di un nuovo "thread di esecuzione".
    Ok l'idea di aver fatto un errore da idiota mi ha sfiorato, ma non immaginavo fino a questo punto...
    A quanto pare ho confuso run() e start()
    Ci credo che i Thread non funzionavano come Thread...

    Grazie per l'illuminazione! Mi hai risparmiato giornate di testate al muro

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.