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

    [Java] Come aggiornare la GUI da thread in esecuzione?

    Ciao a tutti, cercando in rete ho trovato questo forum e sembra interessante.

    Ho un problema: ho dei workers (threads) che eseguono delle operazioni, poi ho una GUI che deve visualizzare lo stato di avanzamento dei lavori dei workers (esempio: quanti dati sono stati elaborati). Di tanto in tanto i workers devono aggiornare questi dati.

    Voi cosa mi consigliate di fare?

    Ciao e grazie!

  2. #2
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    142
    ciao e benvenuto.

    In un'applicazione swing ottieni quello che richiedi utilizzando le SwingUtilites

    codice:
    SwingUtilities.invokeLater(new Runnable(){
          @Override
          public void run(){    
                                // AGGIORNA GLI ELEMENTI CHE TI SERVONO label, text, etc.
    }}  );

  3. #3
    Ciao som, io ho fatto una cosa del genere ma la mia GUI è diventata bloccante.
    In seguito alla pressione di un tasto parte una computazione, i risultati vengono inseriti in un boundedbuffer.
    Con invokeLater mi metto in ascolto del buffer e quando c'è un dato lo prendo e aggiorno una label. Se metto una sola operazione di aggiornamento nessun problema perchè il thread finisce subito, se invece metto l'operazione di aggiornamento in un ciclo while(true){ update... } allora la GUI si blocca e non aggiorna.

  4. #4
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    142
    Non ho ben capito. Però se tu aggiorni in continuazione con quel while(true) credo sia normale che ti si blocchi.
    Potresti provare a mettere uno sleep dopo l'aggiornamento, anche solo di 1secondo e vedere se si blocca.

    codice:
    while(true) {
              update();
              try { 
                    Thread.sleep(1000);
               } 
               catch (InterruptedException e){
               }
    }

  5. #5
    Niente, con Thread.sleep rimane comunque bloccata la GUI.

    E' proprio il while(true){} che blocca la GUI, a prescindere da quello che c'è dentro.
    Adesso provo a lanciare questo ciclo in un nuovo thread.

  6. #6
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    142
    prova a postare un pò di codice che vediamo.

  7. #7
    Metto solo l'idea. Le variabili che mi servono non sto a metterle.

    Codice PHP:
    @Override
    public void actionPerformed(ActionEvent e) {
      if (
    e.getSource() == browse) {
        
    SwingUtilities.invokeLater(new Runnable() {
          public 
    void run() {
            try {
              while(
    true){
                
    update.....
              } 
           } catch (
    InterruptedException e) {
            
    e.printStackTrace();
          }
        }


  8. #8
    Ho risolto il problema creando una classe a parte per l'update.
    Questa classe estende la classe Thread e le passo le label da aggiornare, è concettualmente corretto passare elementi della GUI ad una classe?

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 © 2024 vBulletin Solutions, Inc. All rights reserved.