AppletTalk.com Forum Index AppletTalk.com
Java discussions newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Sospendere upload ed aggiornare barra progressiva

 
Post new topic   Reply to topic    AppletTalk.com Forum Index -> Java (Italian)
View previous topic :: View next topic  
Author Message
Vittorio Menasci
Guest





PostPosted: Tue Sep 23, 2003 3:13 pm    Post subject: Sospendere upload ed aggiornare barra progressiva Reply with 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 B.
Guest





PostPosted: Tue Sep 23, 2003 5:26 pm    Post subject: Re: Sospendere upload ed aggiornare barra progressiva Reply with quote



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





PostPosted: Wed Sep 24, 2003 8:57 am    Post subject: P.S. Reply with quote



Sebbene il mittente sia "Sergio", sono sempre io, Sergio B., da un altro
computer :-)

Sergio B.


Back to top
Vittorio Menasci
Guest





PostPosted: Wed Sep 24, 2003 9:58 am    Post subject: Re: Sospendere upload ed aggiornare barra progressiva Reply with quote

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





PostPosted: Wed Sep 24, 2003 10:37 am    Post subject: Re: Sospendere upload ed aggiornare barra progressiva Reply with quote

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





PostPosted: Thu Sep 25, 2003 8:22 am    Post subject: Re: Sospendere upload ed aggiornare barra progressiva Reply with quote

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





PostPosted: Thu Sep 25, 2003 9:23 am    Post subject: Re: Sospendere upload ed aggiornare barra progressiva Reply with quote

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!Very Happy
Ora devo andare di corsa a fare la spesa!Very Happy
ciao ciao!
Back to top
Sergio B.
Guest





PostPosted: Thu Sep 25, 2003 9:52 am    Post subject: Re: Sospendere upload ed aggiornare barra progressiva Reply with quote

"Nuanda69" <nuanda69nonspammate (AT) galactica (DOT) it> ha scritto:

Quote:
Ciao Sergio!

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"Very Happy e 69 è il numero
perfetto dell'amore!Very Happy

Smile 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!Very Happy

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 Smile !
Un saluto,

Sergio B.



Back to top
Sergio B.
Guest





PostPosted: Thu Sep 25, 2003 10:46 am    Post subject: Re: Sospendere upload ed aggiornare barra progressiva Reply with quote


"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





PostPosted: Mon Apr 26, 2004 7:26 am    Post subject: Re: Sospendere upload ed aggiornare barra progressiva Reply with quote

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
Display posts from previous:   
Post new topic   Reply to topic    AppletTalk.com Forum Index -> Java (Italian) All times are GMT
Page 1 of 1

 
Jump to:  
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


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.