|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Jul 2002
Messaggi: 336
|
Thread in Java
Ho implementato un programmino che mi copia i file da una cartella ad un'altra, facendo comparire una finestra con la percentuale dello stato dello spostamento.
Il problema e' che eseguendo il tutto in un'unico processo, la copia ciuccia tutte le risorse e non fa aggiornare la finestra con la percentuale (quasi non si vede), e comunque non posso schiacciare il tasto annulla, perche' in fase di copia non riesce a sentire l'input. Quindi ho pensato di avviare la copia in un thread a parte, in modo tale da permettere l'input (e quiindi poter annulare l'operazione di copia) e poter far aggiornare la finestra. Il problema e che non so come fare (dovrei sapere quando la copia e' terminata, per poter avviare la copia di un altro file, e nel contempo rendere la finestra con la percentuale sensibile all'input, quindi non posso farci sopra una sleep) Grazie |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Jul 1999
Città: Torino
Messaggi: 2221
|
Dai un'occhiata: http://www.pctuner.net/Software/Java/CercaFiles.zip
|
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Jul 2002
Messaggi: 336
|
Grazie, appena avro' un po' di tempo ci daro' un'occhiata
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Jul 1999
Città: Torino
Messaggi: 2221
|
Qualche dritta
Codice:
private Timer timer;
public final static int ONE_SECOND = 1000;
...
//Create a timer.
timer = new Timer(ONE_SECOND, new TimerListener());
...
class TimerListener implements ActionListener {
public void actionPerformed(ActionEvent evt) {
....
}
}
timer.start();
|
|
|
|
|
|
#5 |
|
Bannato
Iscritto dal: Nov 2001
Città: Verona
Messaggi: 1086
|
Non ho capito bene se hai bisogno di un algoritmo per trasferire i file uno alla volta o se un codice di esempio per far funzionare e controllare un thread; nel dubbio allego un file di testo che contiene un esempio di entrambi.
Riassumendo, una volta ottenute le directory di partenza e destinazione, "infili" i file da trasferire in un array e poi esegui un ciclo, tramite un thread, trasferendo i file uno alla volta; alla pressione del tasto stop sulla finestra di dialogo il booleano "goOn" viene impostato a false e questo provoca l'uscita dal ciclo eseguito all'interno del metodo "run()" del thread. Ciao. |
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Jul 1999
Città: Torino
Messaggi: 2221
|
PGI...mi permetti un'osservazione simpatica??
Se tu risolvi sempre tutti i problemi di chi posta in questo modo, quando imparano (impariamo)?? |
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Jul 2002
Messaggi: 336
|
Ri-Grazie.
Modifichero' l'esempio di PGI aggiungendoci il codice che mi serve PS. Io la lettura del file la faccio tutta in una volta, diminuendo gli accessi al disco ed accelerando la velocita'. Domani vi carichero' il codice (e' una riga, solo che ora non mi ricordo la sintassi precisa) |
|
|
|
|
|
#8 | |
|
Bannato
Iscritto dal: Nov 2001
Città: Verona
Messaggi: 1086
|
Quote:
Mannaggia ho appena risposto da un'altra parte! Ti dirò che le mie intenzioni sono sempre del tipo "ti posto questo e poi discutiamo un po' su cosa e come" ma alla fine ci ritroviamo io e te a discutere nel thread di altri x asdf Occhio che quel codice genera errori a tutto spiano appena incontra qualcosa che non sia un file leggbile. |
|
|
|
|
|
|
#9 | ||
|
Senior Member
Iscritto dal: Jul 1999
Città: Torino
Messaggi: 2221
|
Quote:
|
||
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Jul 2002
Messaggi: 336
|
Ieri finalmente ho trovato un po' di tempo da dedicare al mio programmino, e sono finalmente riuscito a fare il thread: ora la copia funziona che e' una meraviglia
Ps. ecco come copio io i file in una stringa FileInputStream in = new FileInputStream(openList); byte[] readFile=new byte[in.available()]; int totByteRead=in.read(readFile); String tot=new String(readFile); |
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Jul 1999
Città: Torino
Messaggi: 2221
|
Meglio:
Codice:
try
{
File fileInst = new File(nomeFile);
FileReader file = new FileReader(nomeFile);
char[] c = new char[(int)fileInst.length()];
file.read(c);
String buffer = String.copyValueOf(c);
file.close();
}
catch(Exception ex)
{
System.err.println("Exception raised by <getBuffer>: "+ex);
}
|
|
|
|
|
|
#12 | |
|
Senior Member
Iscritto dal: Jan 2001
Città: Milano
Messaggi: 5707
|
Quote:
e' saggio se mettere un "if" sul quella fileInst.length() |
|
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: Jul 1999
Città: Torino
Messaggi: 2221
|
E perchè mai?
|
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: Nov 2001
Città: 100 metri dal mare
Messaggi: 4856
|
Se usi Swing devi avere la classe SwingWorker, leggiti i tutorial della SUN
A me era capitata una cosa del genere sull'esecuzioni di query pesanti su DB.. Con un thread a parte e la classe Swing Worker ho risolto il problema che se non erro e' simile al tuo.. Ciao !
__________________
TIM FTTC 200/20 LIVE SPEEDTEST
|
|
|
|
|
|
#15 | |
|
Senior Member
Iscritto dal: Jul 1999
Città: Torino
Messaggi: 2221
|
Quote:
Codice:
package cercafiles;
import javax.swing.SwingUtilities;
/**
* This is the 3rd version of SwingWorker (also known as
* SwingWorker 3), an abstract class that you subclass to
* perform GUI-related work in a dedicated thread. For
* instructions on using this class, see:
*
* http://java.sun.com/docs/books/tutorial/uiswing/misc/threads.html
*
* Note that the API changed slightly in the 3rd version:
* You must now invoke start() on the SwingWorker after
* creating it.
*/
public abstract class SwingWorker {
private Object value; // see getValue(), setValue()
private Thread thread;
/**
* Class to maintain reference to current worker thread
* under separate synchronization control.
*/
private static class ThreadVar {
private Thread thread;
ThreadVar(Thread t) { thread = t; }
synchronized Thread get() { return thread; }
synchronized void clear() { thread = null; }
}
private ThreadVar threadVar;
/**
* Get the value produced by the worker thread, or null if it
* hasn't been constructed yet.
*/
protected synchronized Object getValue() {
return value;
}
/**
* Set the value produced by worker thread
*/
private synchronized void setValue(Object x) {
value = x;
}
/**
* Compute the value to be returned by the <code>get</code> method.
*/
public abstract Object construct();
/**
* Called on the event dispatching thread (not on the worker thread)
* after the <code>construct</code> method has returned.
*/
public void finished() {
}
/**
* A new method that interrupts the worker thread. Call this method
* to force the worker to stop what it's doing.
*/
public void interrupt() {
Thread t = threadVar.get();
if (t != null) {
t.interrupt();
}
threadVar.clear();
}
/**
* Return the value created by the <code>construct</code> method.
* Returns null if either the constructing thread or the current
* thread was interrupted before a value was produced.
*
* @return the value created by the <code>construct</code> method
*/
public Object get() {
while (true) {
Thread t = threadVar.get();
if (t == null) {
return getValue();
}
try {
t.join();
}
catch (InterruptedException e) {
Thread.currentThread().interrupt(); // propagate
return null;
}
}
}
/**
* Start a thread that will call the <code>construct</code> method
* and then exit.
*/
public SwingWorker() {
final Runnable doFinished = new Runnable() {
public void run() { finished(); }
};
Runnable doConstruct = new Runnable() {
public void run() {
try {
setValue(construct());
}
finally {
threadVar.clear();
}
SwingUtilities.invokeLater(doFinished);
}
};
Thread t = new Thread(doConstruct);
threadVar = new ThreadVar(t);
}
/**
* Start the worker thread.
*/
public void start() {
Thread t = threadVar.get();
if (t != null) {
t.start();
}
}
}
|
|
|
|
|
|
|
#16 | |
|
Senior Member
Iscritto dal: Jan 2001
Città: Milano
Messaggi: 5707
|
Quote:
se e' un file di 500 mega pensi di copiarlo tutto in un aray e poi riscriverlo? |
|
|
|
|
|
|
#17 | ||
|
Senior Member
Iscritto dal: Jul 1999
Città: Torino
Messaggi: 2221
|
Quote:
Un'altra cosa poi è ottimizzare... |
||
|
|
|
|
|
#18 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Solitamente si utilizza comunque un buffer di dimensione fissa... Swappare la memoria fisica su disco è un lavoro molto dispendioso per il sistema opertivo...
Ti ritroveresti con il tuo programma che occupa 500 Mb e tutti glia ltri progammi dovrebbero essere swappati... Pensa poi se la memroia fisica fosse 128 Mb... In quel caso sai quanto swap !!! |
|
|
|
|
|
#19 | |||
|
Senior Member
Iscritto dal: Jan 2001
Città: Milano
Messaggi: 5707
|
Quote:
il problema cui mi riferivo cmq non era questo, se bufferizzi il tutto porti a termine la copia anche se il file e' di 1 giga, se il tuo programma va in OutOfMemoryError o simili verosimilmente no. E in ogni caso usare il try e catch come gestione dei problemi applicativi (come ad esempio un file troppo grosso per stare in memoria) e' sintomo di programmazione scadente... |
|||
|
|
|
|
|
#20 |
|
Senior Member
Iscritto dal: Jul 1999
Città: Torino
Messaggi: 2221
|
Non per niente ho specificato che l'ottimizzazione di un programma è un'altra cosa...parli con uno che deve preoccuparsi di implementare un metodi dispose per ogni classe grafica pena un decadimento prestazionale intollerabile... e che mette a null tutte le variabili prima di uscire da un metodo
Le scelte implementative dipendono dal tipo di programma che uno deve realizzare... Allora lo stesso discorso vale sempre: qualunque struttura o tipo o classe tu usi, se devi trattare un file di 100 terabyte ti voglio vedere... |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 04:46.



















