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

    [JAVA] Progressbar e multithreading

    Salve ragazzi,

    Sto realizzando un'applicazione che all'avvio impiega una decina di secondi per leggere il file, allora volevo visualizzare una progress bar che mi mostrasse, a programma avviato, il caricamento.
    Avevo cercato un tutorial ed ero riuscito a visualizzare la progress bar, e con il metodo setValue la facevo avanzare. Il problema è che anch'essa è rallentata dalla lettura del file.
    Avevo pensato a un applicazione multithreading, ma non ho capito bene come posso realizzare un secondo processo che faccia avanzare la barra

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    In realtà a te serve un thread che faccia la lettura del file.
    Se l'applicazione è visuale (cioè, possiede una GUI), generalmente il thread principale in esecuzione è l'EDT (Event Dispatch Thread), cioè il thread che si occupa di gestire gli eventi dei controlli visuali. Per questo, tutto ciò che è "lavoro pesante" (e l'I/O lo è per sua natura) va spostato in un thread separato in modo che l'EDT non venga mai impegnato per troppo tempo (pena un congelamento della GUI).

    Poi, per poter visualizzare una ProgressBar che faccia vedere a che punto si è con la lettura del file, è necessario conoscere la dimensione del file. Quindi, per prima cosa bisognerà ottenere questa informazione e passarla alla JProgressBar, in modo che sappia gestirsi.

    A questo punto, il tuo Thread dovrebbe ottenere un riferimento alla JProgressBar (o alla classe che la possiede), in modo da poterle comunicare, passo passo, a che punto è con la lettura del file.

    Un modello semplice è il seguente:

    codice:
    // Nella classe che possiede la ProgressBar
    JProgressBar progress = new JProgressBar( ... );
    
    File f = new File( ... );   // Il file che il thread dovrà leggere
    
    // Imposto il massimo alla dimensione (in byte) del file
    progress.setMaximum((int) f.length());
    
    // Avvio il thread passandogli il file da leggere e la progress bar
    ThreadLettore tl = new ThreadLettore(f, progress);
    tl.start();
    Il thread lettore dovrà semplicemente leggere il file a blocchi, fare ciò che deve con ciò che ha letto e aggiornare la progress bar

    codice:
    // Il Thread Lettore
    private JProgressBar progress;
    private File file;
    ...
    public void run() {
       ...
       FileInputStream fis = new FileInputStream( file );
       byte[] buffer = new byte[4096];   // 4 KB di buffer
       int byteLetti = 0;
       while((byteLetti = fis.read(buffer)) >= 0) {
          // Ho letto "byteLetti" bytes di dati
          ...   // Ci faccio quello che devo con quei dati
          // Aggiorno la progressBar
          progress.setValue( progress.getValue() + byteLetti );
       }
       fis.close();
       ...
    }
    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    guarda io ho trovato utilissimo lo swingworker
    RTFM Read That F*** Manual!!!

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.