Newsgroup: it.comp.lang.delphi
Titolo: thread

Per continuare lo sviluppo della mia routine Di DirTree di cui ho
postato il codice in <<Treeview,treenode,treenodes help!>>
vorrei aggiungerci una barra di scorrimento perchè ho visto che
con i 47000 file che gli ho dato in pasto a titolo di collaudo rimane
bloccato per circa 80 secondi e in genere a cavallo dei primi quindici
secondi che un applicazione sembra bloccata si comincia a pensare
male.
Mentre lavora nella costruzione dell'albero la finestra non subisce
alcun refresh
Devo ancora iniziare a studiare l'argomento, ma un approccio che ho 
gia utilizzato con successo  (sotto c++) è stato lanciare
l'elaborazione sotto un tread concorrente.
Mi dareste qualche suggerimento su come fare (apprezzato un esempio
schematico cho le parole chiave da utilizzare).
1)Per lanciare il thread concorrente
2)Per determinarne la priorità 
3)Per comunicare con la finestra in maniera da far vedere lo stato di
avanzamento della procedura
-------------------
Non centra nulla con la domanda sopra, ma come faccio a dare un valore
ad una percentuale di avanzamento ci una procedura che costruisce
l'albero delle directory a partire da un certo ramo in poi?
Il problema è che il numero di file da leggere lo conosco solo alla
fine. La cosa più sensata che mi viene in mente è sprecare tempo
supplementare per fare l'albero delle sole directory (cosa certamente
molto più rapida) giocando in questa fase con una scorrimento un pò
artificiale e slegato dal fenomeno di un primo tratto di barra (ad
esempio 5%) Potrei concedergli 10 secondi con un avanzamento di 0.5%
al secondo e un aggiustamento alla fine (non deve essere
necessariamente un avanzamento lineare) a questo punto divido il resto
della barra 95% per il numero delle directory da scannerizzare è salvo
forti sbilanciamenti ottengo uno scorrimento accettabile.
Ma se avete idee migliori sono pronto ad ascoltarvi.
Grazie
Zilo...@libero.it

 lo conosco solo alla fine.
Pero' puoi rilevare le dimensioni dello spazio occupato
nel disco.
var FreeAvailable, TotalSpace: int64; TotalFree: PLargeInteger;
begin
 GetDiskFreeSpaceEx(pchar('c:\'+#0),FreeAvailable, TotalSpace, nil);
 ProgressBar1.Position := 0;
 // una eventuale progressbar
 // non accetta valori compresi nel range dell'integer
 // potresti dividere per, ad esempio, 1000
 ProgressBar1.Max := ((TotalSpace - FreeAvailable) DIV 1000);
 // ed all'interno della scansione, dopo aver rilevato i file-size
 // inc(VariabileInt64Incremento, ptrfile.size);
 // ProgressBar1.Position := VariabileInt64Incremento div 1000
 DirTree.Items.beginupdate; // basta solo questo, leva gli altri
 pupulatetree(nil);
 DirTree.Items.Endupdate; // basta solo questo, leva gli altri
 // il problema sorge con la gestione dei cluster,
 // se non ti vuoi impelagare ulteriormente
 // alla fine della scansione inserisci qualcosa del genere
 // (anche se un po' bruttino :)
 ProgressBar1.Position := ProgressBar1.Max;
Ehm...non approfondisco, spero solo che
possa andar bene come spunto.
Ciao!
--
AmMaT
m   w
M   A
a   i
TwAiN

 lo conosco solo alla fine.
Pero' puoi rilevare le dimensioni dello spazio occupato
nel disco.
var FreeAvailable, TotalSpace: int64; TotalFree: PLargeInteger;
begin
 GetDiskFreeSpaceEx(pchar('c:\'+#0),FreeAvailable, TotalSpace, nil);
 ProgressBar1.Position := 0;
 // una eventuale progressbar
 // accetta solo valori compresi nel range dell'integer
 // quindi potresti dividere per, ad esempio, 1000


Ciao!
Grazie.