Lettura di un file di testo in un thread

Ciao ragazzi,

sto uscendo matto, ho il codice che vi riporto sotto in un Thread, in pratica dovrebbe aprire un file csv (12MB) e popolare un array, tuttavia dopo qualche ciclo all’interno del While, semplicemente si blocca e non va più avanti (in pratica non vedo mai il messaggio “Finito”).

Qualcuno nota qualcosa di sbagliato o può consigliarmi un approccio diverso per completare l’operazione?

Grazie.


System.Debuglog "Ottengo il file..."
  
Redim Self.arrayRighe(-1)
  
Dim f As FolderItem = SpecialFolder.Desktop.Child("MyFolder").Child("MyFile.csv")
  
If f = Nil Or Not f.Exists Then
 System.Debuglog "Impossibile ottenere il file"
   Return
End If
  
System.Debuglog "Processo il file..."
  
Dim tl As String
Dim t As TextInputStream
t = TextInputStream.Open(f)
t.Encoding = Encodings.UTF8
Call t.ReadLine // SALTO LA RIGA DI INTESTAZIONE
  
While Not t.EOF
    
    tl = t.ReadLine
    tl = cleanString(tl)
    
   Dim r As New Dictionary
    r.Value("codice") = tl.NthField(Self.delimiter, 1)
    r.Value("nome") = tl.NthField(Self.delimiter, 2)
    r.Value("marca") = tl.NthField(Self.delimiter, 6)
    Self.arrayRighe.Append r
    
Wend
  
t.Close

System.Debuglog "Finito"

Si blocca lo stesso se elimini la parte del dictionary e dell’append ? (In pratica scorrendo solo il file…)

Ciao @Antonio Rinaldi , purtroppo si, modificando il codice come segue si blocca comunque nonostante il thread sia ancora attivo, cosa confermata da un timer che ne controlla lo stato.

Se metto un breackpoint su “tl = t.ReadLine”, si vede che qualche giro del While lo fa, ma senza mai portarlo a termine.

System.Debuglog "Ottengo il file..."
  
Redim Self.arrayRighe(-1)
  
Dim f As FolderItem = SpecialFolder.Desktop.Child("MyFolder").Child("MyFile.csv")
  
If f = Nil Or Not f.Exists Then
 System.Debuglog "Impossibile ottenere il file"
   Return
End If
  
System.Debuglog "Processo il file..."
  
Dim tl As String
Dim t As TextInputStream
t = TextInputStream.Open(f)
t.Encoding = Encodings.UTF8
Call t.ReadLine // SALTO LA RIGA DI INTESTAZIONE
  
While Not t.EOF
    
    tl = t.ReadLine
    
Wend
  
t.Close

System.Debuglog "Finito"

Hai provato con :

s=tis.ReadLine.defineEncoding(encodings.UTF8)

prima che ci siano caratteri strani che fanno casino ?

Luciano

[quote=399978:@Ercole Gosi]Hai provato con :

s=tis.ReadLine.defineEncoding(encodings.UTF8)

prima che ci siano caratteri strani che fanno casino ?

Luciano[/quote]

Provato ora, purtroppo continua a non funzionare.

Grazie

Metti in debug, e se si ferma sempre sulla stessa riga, prova a eliminarla a mano e poi rilancia il programma.

Tanto per la cronaca, mettendo la procedura fuori da un Thread, tutto funziona alla perfezione.

Io faccio le stesse cose e tutto funziona con Xojo 2017 R3

Si ferma sempre su righe diverse tipo 1853, 2291, 2597 e 2717

Per capire se il problema legato al codice, potresti inserire alla fine del metodo un

Exception e as RuntimeException
  if 1=0 then exit

Mettendo poi un breakpoint sulla riga della if, puoi in debug andare a vedere le caratteristiche dell’eccezione che si verificata.

Il fatto per che l’interruzione non sia sempre allo stesso punto, mi fa per pensare che il problema non sia nel codice. Domanda: il file csv che il thread elabora viene prodotto, copiato, spostato durante altre parti di codice del programma. Non che quando il thread sta elaborando il file, il file csv stato scritto solo parzialmente?

Ciao Pietro,

ieri notte in qualche modo ho risolto, nel senso che ora funziona tutto anche se non ho capito effettivamente il problema dove stava… Ho dovuto comunque passare alla 2018R2 dato che sulla versione che uso quotidianamente (2016R2.1) comunque non va.