Thread e ProgressBar

Ciao a tutti,

ho creato un thread che mi lancia un processo molto lungo legato alla lunghezza di un file di testo.
La lunghezza del file di testo va a finire nel valore maximum della progressbar.
Ho creato una propriet globale che chiamer gcontatore che all’interno del metodo lanciato viene per ogni riga aggiornato con il suo valore + 1.
Nella action di un timer che ho attivato all’avvio del thread faccio il refresh della progressbar passandogli gcontatore nel valore value.
Quando questo contatore arrivato a 1600 e maximum 67700 la progressbar gi giunta alla fine.

Qualcuno sa darmi una dritta ?

Grazie mille
Toni

Forse perch in gcontatore conti le RIGHE mentre in progressBar.Maximum metti la lunghezza del file in BYTES.

no no sono proprio le righe del file .txt che devo elaborare

Per curiosit, come conti le righe da mettere in progressBar.Maximum?

Ciao Massimo scusa il ritardo,

apro il file e lo metto in un oggetto TextInputStream
scorro il file leggendo riga per riga che memorizzo in un array

Dim S(-1) as String
Dim f as FolderItem
Dim t as TextInputStream

f = GetFolderItem(path)
if f.exists = false then
messaggio
return
end if

t = TextInputStream.Open(f)
while not t.EOF
s.Append t.ReadLine
wend
t.close

alla fine ho

s.ubound

che sono le righe

Quindi tu leggi il file due volte, una per contare le righe e un’altra per caricare i dati?!
Mi pare poco efficiente, non faresti prima ad usare la lunghezza del file in byte (cosa che puoi sapere senza leggerlo tutto) per il maximum della progressbar?

ma poi cosa metto nel value della progressbar ?

Leggendo le varie righe calcoli lal lunghezza in byte delle stringhe che leggi.
Value = value + lenB(riga)+lenB(endOfLine)

Fatto, ma purtroppo il problema rimane …

ho il maximum a 38494798 il value a 15400936

e la progressbar ha gi finito la sua corsa …

Giusto per vedere se ho capito bene…
Tu finisci di leggere il file prima di aver raggiunto il maximum?

In questo caso hai verificato la lunghezza del file se corrisponde a quello che tu imposti come maximum?

non funziona il progressbar …
l’elaborazione continua malgrado sia arrivato alla fine della progressbar …

non so se mi spiego …

ho un maximum di 38494798
nel value ci metto un contatore che dato da Value = value + lenB(riga)+lenB(endOfLine)

ma arrivato a poco pi di 15400936 la progressbar gi conclusa anche se manca parecchio alla fine dell’elaborazione che continua tranquillamente fino alla fine.

Ammesso che il Maximum sia corretto, l 'unica risposta possible che tu incrementi troppo il value.
Se postassi il codice potrebbe aiutare.

Prova a lasciare il maximum as 100 e mettere come value (con il timer)
100*(cvalue + lenB(riga)+lenB(endOfLine)/cmaximum)

se vuoi puoi farlo in millesimi… invece che in centesimi.
Dove cValue e cMaximum sono i tuoi valori correnti e il la lunghezza del file

non credo ci siano errori in quanto ho messo nel titolo della finestra la stampa sia del maximum della progressbar sia il value corrente e i valori che vedo incrementarsi sono giusti.

non capisco ma di sicuro sbaglio qualcosa

Il valore di lunghezza del file un uint64
il valore e il massimo della progress bar un integer
La cosa migliore per sicurezza impostare un valore percentuale. Tra l’altro, se vuoi, puoi controllare il valore corrente e se non necessario non aggiornare la progressbar risparmiando ulteriormente tempo.

Esattamente come dici tu, la progressbar deve essere gestita con interi.
Quindi gestir l’int64 in percentuale.

I valori della progressbar devono essere impostati cos

maximum = 100 e value = 0

Divido per 100 il valore int64 derivante dal folderitem che sto leggendo

percentuale = folderitem.lenght/100

Nel loop ad una variabile byteletti aggiungo la lunghezza della riga del file che sto leggendo e la lunghezza dell’endofline.

byteletti = byteletti  + lenb(riga) + lenb(endoffile)

quindi il value della progressbar sar

value =  floor(byteletti/percentuale)

Grazie ancora a tutti
Toni