 |
AppletTalk.com Java discussions newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Vittorio Menasci Guest
|
Posted: Tue Sep 23, 2003 3:13 pm Post subject: Sospendere upload ed aggiornare barra progressiva |
|
|
Prendendo spunto da un'applet trovata su internet sto provando a scrivere
una classe che uplodi un file in ftp e contemporaneamente aggiorni la barra
di progressione.Il codice è:
do{
available = fileIn.available();
fileIn.read(dummy, 0, bsize);
bytesRead = fileSize - available;
pProgressBar.setValue(bytesRead);
pStatusTxt.setText(pProgressBar.getString() + " done.");
if(available < bsize)
bsize = available;
fileOut.write(dummy, 0, bsize);
} while(!aborted && available > 0);
Il problema è che la barra non si aggiorna fino a che non è terminato
l'upload visualizzando direttamente il 100%.(L'upload funziona!!).Non sono
assolutamento un esperto.Q.no mi dà un suggerimento?
Grazie
Vittorio Menascì
--------------------------------
Inviato via http://usenet.libero.it
|
|
| Back to top |
|
 |
Sergio B. Guest
|
Posted: Tue Sep 23, 2003 5:26 pm Post subject: Re: Sospendere upload ed aggiornare barra progressiva |
|
|
Ho usato una JProgressBar diverso tempo fa e mi sembra che per visualizzarla
e farla funzionare correttamente tu debba, prima di tutto, impostare il
valore minimo e massimo (nel tuo caso suppongo 0 e la dimensione del file),
tramite i metodi, JavaDoc alla mano, "setMinimum" e "setMaximum", e poi,
come mi sembra che tu già faccia nel tuo codice, aggiornarla con "setValue".
Prova e magari fammi sapere.
Saluti,
Sergio B.
"Vittorio Menasci" <vittorio.menasci (AT) libero (DOT) it> ha scritto nel messaggio
news:62Z94Z13Z93Y1064330146X30632 (AT) usenet (DOT) libero.it...
| Quote: | Prendendo spunto da un'applet trovata su internet sto provando a scrivere
una classe che uplodi un file in ftp e contemporaneamente aggiorni la
barra
di progressione.Il codice è:
do{
available = fileIn.available();
fileIn.read(dummy, 0, bsize);
bytesRead = fileSize - available;
pProgressBar.setValue(bytesRead);
pStatusTxt.setText(pProgressBar.getString() + " done.");
if(available < bsize)
bsize = available;
fileOut.write(dummy, 0, bsize);
} while(!aborted && available > 0);
Il problema è che la barra non si aggiorna fino a che non è terminato
l'upload visualizzando direttamente il 100%.(L'upload funziona!!).Non sono
assolutamento un esperto.Q.no mi dà un suggerimento?
Grazie
Vittorio Menascì
--------------------------------
Inviato via http://usenet.libero.it
|
|
|
| Back to top |
|
 |
Sergio Guest
|
Posted: Wed Sep 24, 2003 8:57 am Post subject: P.S. |
|
|
Sebbene il mittente sia "Sergio", sono sempre io, Sergio B., da un altro
computer :-)
Sergio B.
|
|
| Back to top |
|
 |
Vittorio Menasci Guest
|
Posted: Wed Sep 24, 2003 9:58 am Post subject: Re: Sospendere upload ed aggiornare barra progressiva |
|
|
| Quote: | Non so se i miei commenti sono giusti, anche perchè non >conosco il
contesto
del tuo codice nè soprattutto ciò che viene prima.
Prendili in considerazione, comunque, e fammi sapere...
Magari posti un frammento più grande con qualche tuo commento...
Saluti,
Scusate se posto tagliando q.sa ma altrimenti ci perdiamo.... |
Intanto grazie per la consulenza e la competenza con cui rispondete.
Provo a postare tutta la fuzione di upload
private void upload()
{
if(!connected)
return;
int bsize = 0x13880;
byte dummy[] = new byte[bsize];
Socket dataSocket = null;
try
{
FileInputStream fileIn = new FileInputStream(file);
if(sendFtpCmd("TYPE I"))
dataSocket = openDataSocket("STOR " + file.getName());
if(dataSocket != null && statusCode < 400)
{
OutputStream fileOut = dataSocket.getOutputStream();
int fileSize = fileIn.available();
pProgressBar.setMaximum(fileSize);
do
{
available = fileIn.available();
fileIn.read(dummy, 0, bsize);
bytesRead = fileSize - available;
setProgress(bytesRead);
if(available < bsize)
bsize = available;
fileOut.write(dummy, 0, bsize);
} while(!aborted && available > 0);
fileIn.close();
fileOut.close();
setProgress(0);
if(successUrl != null)
getAppletContext().showDocument(new URL(successUrl));
if(aborted)
{
String tmp = socketIn.readLine();
socketCon.println("DELE " + localFile.getName());
tmp = socketIn.readLine();
setStatus("Transfer aborted by User");
} else
{
setStatus(socketIn.readLine());
} } else
{
setStatus("Upload Failed!");
}
}
catch(MalformedURLException ux) { }
catch(FileNotFoundException sx)
{
appletStatus = "Failed";
setStatus("File not found!");
}
catch(Exception sx)
{
appletStatus = "Failed";
setStatus(sx.toString());
sx.printStackTrace();
FileInputStream fileIn = null;
}
}
Rispondendo anche a Nuanda69 il riferimento è preciso ma implementare tutto
da zero non è banale, hai forse a disposizione un link di un tutorial?
--------------------------------
Inviato via http://usenet.libero.it
|
|
| Back to top |
|
 |
Sergio B. Guest
|
Posted: Wed Sep 24, 2003 10:37 am Post subject: Re: Sospendere upload ed aggiornare barra progressiva |
|
|
Spero che Nuanda non si offenda, ma non penso che il problema sia tanto
complesso da richiedere una soluzione quale quella da lui/lei indicata.
D'altronde, tempo fa ho usato la JProgressBar proprio per indicare il
progredire di un download/upload in un'applicazione client/server e non ho
avuto alcun problema.
Adesso, premesso che guardando il tuo codice secondo me rimane
l'imprecisione che ti ho indicato prima, potrebbe accadere questo:
- Poniamo che bsize abbia dimensione x
- Poniamo che il file abbia dimensione y <= x
- Al primo ciclo viene letto tutto il file
- available, per l'imprecisione di prima, non è comunque 0, quindi rientra
nel ciclo
- available diventa 0 in quanto è stato letto tutto il file
- la lettura viene ripetuta ma tanto non c'è nulla...
- fileSize - available = fileSize - 0 = fileSize -> bytesRead=fileSize ->
100% !!!
- alla fine, esce...
Non so se mi sono spiegato...
Prova a far stampare delle stringhe di controllo a mo' di debug (che ad es.
monitorino bytesRead e available...)
Fammi sapere,
Un saluto,
Sergio B.
"Vittorio Menasci" <vittorio.menasci (AT) libero (DOT) it> ha scritto nel messaggio
news:62Z94Z13Z93Y1064397660X5367 (AT) usenet (DOT) libero.it...
| Quote: | Non so se i miei commenti sono giusti, anche perchè non >conosco il
contesto
del tuo codice nè soprattutto ciò che viene prima.
Prendili in considerazione, comunque, e fammi sapere...
Magari posti un frammento più grande con qualche tuo commento...
Saluti,
Scusate se posto tagliando q.sa ma altrimenti ci perdiamo....
Intanto grazie per la consulenza e la competenza con cui rispondete.
Provo a postare tutta la fuzione di upload
private void upload()
{
if(!connected)
return;
int bsize = 0x13880;
byte dummy[] = new byte[bsize];
Socket dataSocket = null;
try
{
FileInputStream fileIn = new FileInputStream(file);
if(sendFtpCmd("TYPE I"))
dataSocket = openDataSocket("STOR " + file.getName());
if(dataSocket != null && statusCode < 400)
{
OutputStream fileOut = dataSocket.getOutputStream();
int fileSize = fileIn.available();
pProgressBar.setMaximum(fileSize);
do
{
available = fileIn.available();
fileIn.read(dummy, 0, bsize);
bytesRead = fileSize - available;
setProgress(bytesRead);
if(available < bsize)
bsize = available;
fileOut.write(dummy, 0, bsize);
} while(!aborted && available > 0);
fileIn.close();
fileOut.close();
setProgress(0);
if(successUrl != null)
getAppletContext().showDocument(new URL(successUrl));
if(aborted)
{
String tmp = socketIn.readLine();
socketCon.println("DELE " + localFile.getName());
tmp = socketIn.readLine();
setStatus("Transfer aborted by User");
} else
{
setStatus(socketIn.readLine());
} } else
{
setStatus("Upload Failed!");
}
}
catch(MalformedURLException ux) { }
catch(FileNotFoundException sx)
{
appletStatus = "Failed";
setStatus("File not found!");
}
catch(Exception sx)
{
appletStatus = "Failed";
setStatus(sx.toString());
sx.printStackTrace();
FileInputStream fileIn = null;
}
}
Rispondendo anche a Nuanda69 il riferimento è preciso ma implementare
tutto
da zero non è banale, hai forse a disposizione un link di un tutorial?
--------------------------------
Inviato via http://usenet.libero.it
|
|
|
| Back to top |
|
 |
Vittorio Menasci Guest
|
Posted: Thu Sep 25, 2003 8:22 am Post subject: Re: Sospendere upload ed aggiornare barra progressiva |
|
|
Hai perfettamente ragione!
X Sergio. Ho inserito una serie di output di variabili (available,bytesread
ecc) ed i valori sono sempre congruenti sebbene la tua eccezione sia
pertinente.
Come dice nuanda(carpe diem trota gnam)il problema è che l'interfaccia è
assolutamente bloccata fino a che non termina la scrittura, dopo di che
vengono visualizzati tutti i messaggi di debug che ho inserito in una
JTextArea del JPanel, (quindi ad es.il classico 27% fatto,ecc), mentre in
fase di esecuzione funziona solo la finestra dos, che peraltro mi garantisce
l'esatto passaggio tra I/O file e update progressbar.
Ringraziando per l'aiuto, vi saluto.
Vittorio Menascì
| Quote: | Quello che ho "capito" io è che il problema di aggiornamento della
JProgressBar è un problema di Swing, per via del EventDispatchThread
che viene "bloccato" dall'esecuzione del while (un'operazione lunga)
che blocca il repaint della finestra.
Se ho capito giusto tutta l'interfaccia grafica dovrebbe sembrare
congelata!
|
--------------------------------
Inviato via http://usenet.libero.it
|
|
| Back to top |
|
 |
Nuanda69 Guest
|
Posted: Thu Sep 25, 2003 9:23 am Post subject: Re: Sospendere upload ed aggiornare barra progressiva |
|
|
Allora prova a risolvere il problema così, sostituisci al posto del
while un timer.
Crei un timer (swing) che generi un evento ogni decimo di secondo, poi
ci aggiungi un ActionListener che gli fa aggiornare la progressbar.
Ora sono di corsa, se non riesci a scrivere il codice posta la
richiesta e oggi pomeriggio con più calma te lo scrivo!
Ora devo andare di corsa a fare la spesa!
ciao ciao!
|
|
| Back to top |
|
 |
Sergio B. Guest
|
Posted: Thu Sep 25, 2003 9:52 am Post subject: Re: Sospendere upload ed aggiornare barra progressiva |
|
|
"Nuanda69" <nuanda69nonspammate (AT) galactica (DOT) it> ha scritto:
Ciao!
| Quote: | Intanto informo il news che sono un ragazzo di 20 anni... Nuanda a
"L'attimo Fuggente" ("Se dovessere esistere un Dio dell'amore... beh,
quello deve aver imparato da me, chiamatemi Nuanda" e 69 è il numero
perfetto dell'amore!
|
Wow!
| Quote: | non mi offendo
affatto, sono un principiante e cerco di aiutare perchè altrimenti mi
sento un "mangia pane a tradimento" ma a volte (spesso) sbaglio!
|
Comunque anch'io sono + o - nella tua stessa situazione, soprattutto non
sono di certo un esperto!
| Quote: | Quello che ho "capito" io è che il problema di aggiornamento della
JProgressBar è un problema di Swing, per via del EventDispatchThread
che viene "bloccato" dall'esecuzione del while (un'operazione lunga)
che blocca il repaint della finestra.
Se ho capito giusto tutta l'interfaccia grafica dovrebbe sembrare
congelata!
|
Forse ho capito quello che vuoi dire...e avevi ragione!
Guarda il successivo post di Vittorio...
Tuttavia, io ho ancora qualche dubbio sul perchè di tale comportamento...
Questo è il frammento di codice in cui ho usato la JProgressBar:
for (int i=0; i
{
n=in.read(buffer,0,BUFLEN);
fout.write(buffer,0,n);
label.setText((i + " / " + size + " bytes"));
progressBar.setValue(i);
}
Come vedi la situazione è analoga a quella di Vittorio, e non mi dà
problemi.
Probabilmente accade che Vittorio chiami il metodo upload entro il listener
di un componente della sua GUI, senza inserirlo in un altro thread, ed il
problema non è in questo caso la monopolizzazione della cpu da parte del
ciclo, ma l'uscita dal listener, ritardata fino al termine dell'upload!
In tal modo, infatti, la coda degli eventi si "blocca" in quanto per gestire
gli eventi successivi (l'aggiornamento della progressbar, dei campi
testo...) deve essere terminata la gestione dei precedenti (il listener in
cui viene eseguito l'upload)!
Il tutto si risolve inserendo il metodo upload in un altro thread, che potrà
tranquillamente essere lanciato all'interno di un listener; in tal modo,
continueranno indipendenti l'upload e l'aggiornamento dell'interfaccia
grafica.
Era questo, in dettaglio, che intendevi dire?
O hai qualche altra idea?
Intanto, grazie per l'interessante discussione...fa sempre piacere !
Un saluto,
Sergio B.
|
|
| Back to top |
|
 |
Sergio B. Guest
|
Posted: Thu Sep 25, 2003 10:46 am Post subject: Re: Sospendere upload ed aggiornare barra progressiva |
|
|
"Vittorio Menascì" <vittorio.menasci (AT) libero (DOT) it> ha scritto:
| Quote: | Intanto dico che ho risolto con
il timer (UP per nuanda)
|
Perfetto.
| Quote: | Ero arrivato a creare due thread distinti per upload e progress.Però da
assoluto principiante e per non complicarmi troppo la vita ho generato il
listener come classe privata interna al frame poteva essere questo un
problema?
|
No, non penso.
Se hai tempo/voglia (potresti non averne visto che hai già risolto), prova a
mettere il metodo upload che hai postato entro una classe thread, interna
però alla classe del frame principale, dove hai gli oggetti grafici, in modo
da avere accesso a questi (non è l'unica soluzione ma è secondo me la più
semplice); una cosa del genere:
public class MainFrame extends JFrame
{
// [...]
private class Uploader extends Thread
{
public void run()
{
// Inserisci qui il codice di upload() da te postato
}
}
// [...]
}
A questo punto, se il tuo upload è lanciato da un bottone, inserisci
nell'ActionListener di tale bottone il seguente frammento:
Thread t=new Uploader();
t.start();
Tutto dovrebbe andare per il verso giusto.
Fammi sapere...
Il piacere è mio!
Un saluto,
Sergio B.
|
|
| Back to top |
|
 |
Gab. Guest
|
Posted: Mon Apr 26, 2004 7:26 am Post subject: Re: Sospendere upload ed aggiornare barra progressiva |
|
|
| Quote: | Puoi risolvere il problema in diversi modi:
1. Usi un thread separato e il metodo SwingUtilities.invokeLater()
2. Usi uno SwingWorker
3. Oppure, la soluzione che preferisco, consigliatami da EchelonNSA
|
Esiste un'altra alternativa ed è quella che di solito utilizzo e preferisco.
Guarda in questo sito:
http://foxtrot.sourceforge.net/
Permette di risolvere il tuo problema in modo sincrono (cosa che le prime
due alternative non permettono) ed il tutto è relativamente semplice da
implementare con un piccolissimo impatto sul codice esistente.
Gab.
|
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|