Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Polestar 3 Performance, test drive: comodità e potenza possono convivere
Polestar 3 Performance, test drive: comodità e potenza possono convivere
Abbiamo passato diversi giorni alla guida di Polestar 3, usata in tutti i contesti. Come auto di tutti i giorni è comodissima, ma se si libera tutta la potenza è stupefacente
Qualcomm Snapdragon X2 Elite: l'architettura del SoC per i notebook del 2026
Qualcomm Snapdragon X2 Elite: l'architettura del SoC per i notebook del 2026
In occasione del proprio Architecture Deep Dive 2025 Qualcomm ha mostrato in dettaglio l'architettura della propria prossima generazione di SoC destinati ai notebook Windows for ARM di prossima generazione. Snapdragon X2 Elite si candida, con sistemi in commercio nella prima metà del 2026, a portare nuove soluzioni nel mondo dei notebook sottili con grande autonomia
Recensione DJI Mini 5 Pro: il drone C0 ultra-leggero con sensore da 1 pollice
Recensione DJI Mini 5 Pro: il drone C0 ultra-leggero con sensore da 1 pollice
DJI Mini 5 Pro porta nella serie Mini il primo sensore CMOS da 1 pollice, unendo qualità d'immagine professionale alla portabilità estrema tipica di tutti i prodotti della famiglia. È un drone C0, quindi in un peso estremamente contenuto e che non richiede patentino, propone un gimbal rotabile a 225 gradi, rilevamento ostacoli anche notturno e autonomia fino a 36 minuti. Caratteristiche che rendono il nuovo drone un riferimento per creator e appassionati
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 09-05-2006, 11:51   #1
softoxy
Member
 
Iscritto dal: Aug 2004
Messaggi: 83
[JAVA]Componente progress bar sfarfalla

Ho creato un programmino che effettua l'FTP comprensivo di stato di avanzamento del processo tramite componente JProgressBar.
La progress bar l'ho inserita all'interno di un ciclo while che invia byte per byte il file.
Il problema è l'effetto sfarfallio che si ottiene quando viene ridisegnata ogni volta la progress bar.

while (true) {
c = is.read(); // LEGGO DAL FILE BYTE PER BYTE
if (c < 0)
break;
os.write(c);
numByte++;
percentualeStatus = (int)Math.round(((numByte) / byteTotal) * 100);

if (percentualeStatus != percentualeStatusOld) {
jProgressBarFTP.setValue(percentualeStatus); // SETTO IL VALORE IN PERCENTUALE
percentualeStatusOld = percentualeStatus;
jProgressBarFTP.paint(jProgressBarFTP.getGraphics()); //RIDISEGNO IL COMPONENTE
}
}

Come posso togliere lo sfarfallio? Per mezzo di un thread? Ma in corrispondenza solo del ridisegnamento del componente?

Aiuto, grazie.
__________________
SoftOXY!2004
softoxy è offline   Rispondi citando il messaggio o parte di esso
Old 09-05-2006, 17:04   #2
sottovento
Senior Member
 
L'Avatar di sottovento
 
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
Quote:
Originariamente inviato da softoxy
...omissis...
Come posso togliere lo sfarfallio? Per mezzo di un thread? Ma in corrispondenza solo del ridisegnamento del componente?

Aiuto, grazie.
Ciao,
in effetti e' la soluzione migliore: crei un nuovo thread ed all'interno di quest'ultimo esegui le operazione di lettura dalla rete, mentre il thread principale sara' libero di rinfrescare la tua progress bar.
In questo modo non solo elimini la paint(), causa dei tuoi problemi: puoi anche integrare la tua progress bar in un dialogo/frame con un bottone "Cancella" per fermare l'esecuzione (ti basta una semplice variabile booleana).

High Flying
Sottovento
__________________
In God we trust; all others bring data
sottovento è offline   Rispondi citando il messaggio o parte di esso
Old 09-05-2006, 22:59   #3
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Questa riga

jProgressBarFTP.paint(jProgressBarFTP.getGraphics()); //RIDISEGNO IL COMPONENTE

è un po' anomala.

L'invocazione di setValue provvede in via autonoma ad aggiornare l'aspetto della barra di progresso.

Nel caso in cui non provveda c'è qualcosa che non va. Una svista tipica è l'invocazione di "setValue" ad opera di un Thread diverso dallo AWT Event Dispatcher Thread. E' possibile (solo possibile) che sia il tuo caso perchè leggo che maneggi byte lungo un flusso, cosa a cui si deve dedicare un Thread certamente diverso dall'Event Dispatcher. In questo caso circondi l'invocazione che aggiorna il componente AWT/Swing con uno:

Codice:
//final value = percentualeStatus;
SwingUtilities.invokeLater(new Runnable() {
    public void run() {
        jProgressBarFTP.setValue(value);
    }
});
Sinteticamente, "invokeLater" fa sì che il metodo "run" del Runnable che riceve come argomento sia eseguito da quell'unico Thread (Event Dispatcher) che può e deve produrre un corretto aggiornamento grafico dei componenti.
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 10-05-2006, 15:59   #4
softoxy
Member
 
Iscritto dal: Aug 2004
Messaggi: 83
.............

Grazie per le risposte.
Avevo già provato a far girare il ciclo while() all'interno di un thread, ma non funziona. Mi da lo stesso errore se inserisco il pezzo di codice suggeritomi da PGI-Bis, errore di scrittura sul socket e mi blocca la rete.
Non posso più accedere alla rete.
Come posso ripristinare lo stato iniziale? Io ho provato con net stop e net start, ma non ha effetto, devo riavviare la macchina per avere risultati.
Bà????
__________________
SoftOXY!2004
softoxy è offline   Rispondi citando il messaggio o parte di esso
Old 10-05-2006, 16:45   #5
sottovento
Senior Member
 
L'Avatar di sottovento
 
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
Quote:
Originariamente inviato da softoxy
Grazie per le risposte.
Avevo già provato a far girare il ciclo while() all'interno di un thread, ma non funziona. Mi da lo stesso errore se inserisco il pezzo di codice suggeritomi da PGI-Bis, errore di scrittura sul socket e mi blocca la rete.
Non posso più accedere alla rete.
Come posso ripristinare lo stato iniziale? Io ho provato con net stop e net start, ma non ha effetto, devo riavviare la macchina per avere risultati.
Bà????
Il suggerimento di PGI-Bis e' corretto (come sempre). E' probabile che ci sia qualcos'altro da controllare. Se vuoi, pubblica il codice, lo guardiamo insieme.
Cmq alcuni suggerimenti:
- per quanto riguarda lo spostamento del ciclo while all'interno di un thread, e' la soluzione che adotto praticamente sempre. Non ho voglia di inventare cose nuove, per cui uso sempre quella in quanto e' semplice e robusta.
- Ovviamente l'apertura di un eventuale dialogo di attesa, con la relativa JProgressBar NON deve esser fatta in quel thread: se vuoi aprire una simile finestra, lo dovrai fare dal thread principale.
- La rete non viene influenzata da questo. Pubblica il codice, vediamo di risolvere. Beh, a dire il vero ora vado a dormire, ma su questo forum c'e' sicuramente gente molto piu' in gamba di me che ti sa aiutare....

High Flying
Sottovento
__________________
In God we trust; all others bring data
sottovento è offline   Rispondi citando il messaggio o parte di esso
Old 10-05-2006, 16:59   #6
softoxy
Member
 
Iscritto dal: Aug 2004
Messaggi: 83
..............

ok, non sono d'accordo sul mettere tutto il codice, perchè penso che sia fastidioso leggere tutte queste righe, ma se tu mi dici che le leggeranno...

metto solo il metodo che implementa l'invio del file in ftp, la jProgressBar è nella classe che richiama questo metodo:

private void inviaFileFTP (String pathFile) {
double byteTotal = 0;
String fileName = "";
int errorConnect;
int percentualeStatusOld = 0;

errorConnect = FTPConnect (utente.getFtpConfig().getHost(), utente.getFtpConfig().getUser(), utente.getFtpConfig().getPass());
if (errorConnect > 0 && errorConnect != 230) {
return ;
}

String file_da_aprire = pathFile;
File inputFile = new File(file_da_aprire);

byteTotal = inputFile.length();
fileName = inputFile.getName();

textAreaFTP.append("transfert: " + fileName + " " + String.valueOf(byteTotal) + " byte\r\n");

OutputStream os = null;
FileInputStream is = null;

try {
ftp.setFileType( FTPClient.BINARY_FILE_TYPE );
int indexToken = fileName.lastIndexOf(".");

String ext = fileName.substring(indexToken);
newNameFile = "FILE_" + DateUtilities.getString(materiale.getDataPubblicazione()) + ext;

os = ftp.storeFileStream(newNameFile);

is= new FileInputStream( file_da_aprire);
int c;
int numByte = 0;

jProgressBarFTP.setValue(0);
jProgressBarFTP.setStringPainted(true);


while (true) {
c = is.read();
if (c < 0)
break;
os.write(c);
numByte++;
final int percentualeStatus = (int)Math.round(((numByte) / byteTotal) * 100);
//textField1.setText(String.valueOf(numBuyte));
//System.out.println(percentualeStatuts);
if (percentualeStatus != percentualeStatusOld) {
jProgressBarFTP.setValue(percentualeStatus);
/*
SwingUtilities.invokeLater(new Runnable() {
public void run() {
jProgressBarFTP.setValue(percentualeStatus);
}
});
*/
percentualeStatusOld = percentualeStatus;

//jProgressBarFTP.paint(jProgressBarFTP.getGraphics());
}
}


//InviaFile iFile = new InviaFile(is, os, jProgressBarFTP, byteTotal);
//Thread t = new Thread(iFile);
//t.run();
os.close();
is.close();

textAreaFTP.append(ftp.getReplyString());


}
catch (Throwable t) {
MessageDialog.throwable(this, t);
}

FTPDisconnect ();

}

}
__________________
SoftOXY!2004

Ultima modifica di softoxy : 10-05-2006 alle 17:01.
softoxy è offline   Rispondi citando il messaggio o parte di esso
Old 10-05-2006, 17:05   #7
sottovento
Senior Member
 
L'Avatar di sottovento
 
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
Quote:
Originariamente inviato da softoxy
ok, non sono d'accordo sul mettere tutto il codice, perchè penso che sia fastidioso leggere tutte queste righe, ma se tu mi dici che le leggeranno...

metto solo il metodo che implementa l'invio del file in ftp, la jProgressBar è nella classe che richiama questo metodo:

... omissis ...

}
Buon codice. Tuttavia le parole che hai scritto sopra sembrano piu' interessanti:
Quote:
Originariamente inviato da softoxy
la jProgressBar è nella classe che richiama questo metodo
Se si tratta dello stesso thread, allora non hai chance di aggiornare correttamente la jprogress bar, in quanto terrai questo thread "fermo" nella tua funzione. La tua funzionalita' deve quindi essere spostata in un altro thread e lasciare che il thread che gestisce la jProgressBar possa ritornare il controllo alla virtual machine, la quale provvedera' all'aggiornamento.
In alternativa, usa il codice di PGI-Bis, ma ti consiglio vivamente di fare questa funzione in un thread separato. Si tratta di poco lavoro....

Per quanto riguarda la rete, non vedo alcun problema. Purtroppo non ho il tempo di fare prove...

High Flying
Sottovento
__________________
In God we trust; all others bring data
sottovento è offline   Rispondi citando il messaggio o parte di esso
Old 10-05-2006, 17:10   #8
softoxy
Member
 
Iscritto dal: Aug 2004
Messaggi: 83
..........

Grazie, grazie ancora.
Eppure ogni volta che metto il codice di PGI o se vedi la parte commentata c'era un therad che faceva il ciclo, mi blocca la rete.
I canali os e is li chiudo, forse devo chiuderli all'interno del thread, adesso provo

Ancora grazie.
__________________
SoftOXY!2004

Ultima modifica di softoxy : 10-05-2006 alle 17:30.
softoxy è offline   Rispondi citando il messaggio o parte di esso
Old 10-05-2006, 17:33   #9
softoxy
Member
 
Iscritto dal: Aug 2004
Messaggi: 83
.........

si funziona, mettendo la chiusura dei canali is ed os all'interno del thread l'invio del file avviene e si chiudono senza bloccarmi la rete, solamente il thread sembra essere sempre bloccante, perchè la jProgressBar non si visualizza se non alla fine (100%).
__________________
SoftOXY!2004
softoxy è offline   Rispondi citando il messaggio o parte di esso
Old 10-05-2006, 17:44   #10
softoxy
Member
 
Iscritto dal: Aug 2004
Messaggi: 83
............

La classe InviaFile

package it.computime.object;
import cfc.swing.MessageDialog;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import javax.swing.JOptionPane;
import javax.swing.JProgressBar;

public class InviaFile implements Runnable {
int c;
int numByte = 0;
int percentualeStatus = 0, percentualeStatusOld = 0;
FileInputStream is = null;
OutputStream os = null ;
JProgressBar jProgressBar = null;
double byteTotal = 0;

public InviaFile(FileInputStream is, OutputStream os, JProgressBar jProgressBar, double byteTotal) {
this.is = is;
this.os = os;
this.jProgressBar = jProgressBar;
this.byteTotal = byteTotal;
}

public void run() {
try {
while (true) {
c = is.read();
if (c < 0)
break;
os.write(c);
numByte++;
percentualeStatus = (int)Math.round(((numByte) / byteTotal) * 100);

if (percentualeStatus != percentualeStatusOld) {
jProgressBar.setValue(percentualeStatus);
percentualeStatusOld = percentualeStatus;
jProgressBar.repaint();
}
}
os.close();
is.close();
}
catch (IOException e) {
JOptionPane.showMessageDialog(null, e);
}
}
}
__________________
SoftOXY!2004
softoxy è offline   Rispondi citando il messaggio o parte di esso
Old 10-05-2006, 17:53   #11
softoxy
Member
 
Iscritto dal: Aug 2004
Messaggi: 83
......

.l'errore è nel far partire il thread con run, ecco perchè è bloccante.
Devo farlo partire con il metodo start(), però mi dice "Bad File Descriptor"
eppure il file è is............?????
__________________
SoftOXY!2004
softoxy è offline   Rispondi citando il messaggio o parte di esso
Old 10-05-2006, 17:55   #12
softoxy
Member
 
Iscritto dal: Aug 2004
Messaggi: 83
........

forse ho capito, perchè chiuso subito il canale, il thread parte e io gli chiudo il canale sotto... il puzzle si chiude!
__________________
SoftOXY!2004
softoxy è offline   Rispondi citando il messaggio o parte di esso
Old 11-05-2006, 11:28   #13
softoxy
Member
 
Iscritto dal: Aug 2004
Messaggi: 83
Risolto.
Ho sbagliato di concetto.
Io pensavo di dover mettere nel thread solo il ciclo while, ma da come si vede nel metodo, si aprono canali e si chiudono al termine dell'operazione.
Mettendo tutte le operazioni del metodo all'interno del thread e spostando l'intero controllo dell'operazione al thread, funziona tutto benissimo.
E' vero, la finestra principale ha la possibilità di ridisegnarsi, quindi spostando anche la finsestra la progressBar non sfarfalla (utilizzando solamente setValue()) e indica il progresso del processo.

Grazie per i fantastici aiuti.
__________________
SoftOXY!2004
softoxy è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Polestar 3 Performance, test drive: comodità e potenza possono convivere Polestar 3 Performance, test drive: comodit&agra...
Qualcomm Snapdragon X2 Elite: l'architettura del SoC per i notebook del 2026 Qualcomm Snapdragon X2 Elite: l'architettura del...
Recensione DJI Mini 5 Pro: il drone C0 ultra-leggero con sensore da 1 pollice Recensione DJI Mini 5 Pro: il drone C0 ultra-leg...
ASUS Expertbook PM3: il notebook robusto per le aziende ASUS Expertbook PM3: il notebook robusto per le ...
Test ride con Gowow Ori: elettrico e off-road vanno incredibilmente d'accordo Test ride con Gowow Ori: elettrico e off-road va...
'Robot abbastanza forti da fratturare un...
Anche DAZN ha il suo Black Friday: 40 eu...
Carmageddon: Rogue Shift, il prossimo ca...
Redal Alert 2: Command & Conquer si ...
Kingston Technology: memorie e storage c...
Narwal Freo Z10 Ultra: il robot con moci...
In 3 minuti le vedete tutte: sono le mig...
Black Friday da record per Tineco: le sc...
La nuova PS5 con Fortnite manda in tilt ...
Amazon, i tagli hanno colpito soprattutt...
Pazzesco: Panasonic Lumix DC-GH5M2E a 79...
Ecco tutte le offerte Black Friday pi&ug...
DJI Neo a 169€, Flip Combo a 309€ e molt...
Quattro persone arrestate negli USA per ...
Kindle Paperwhite Signature Edition, Col...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 16:45.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v