Lettura di un file di testo in un thread

  1. 3 months ago

    Matteo L

    Aug 9 Pre-Release Testers Europe (Montebelluna (TV), Ita...
    Edited 3 months ago

    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"
    
  2. Antonio R

    Aug 9 Pre-Release Testers, Xojo Pro Europe (Italy)

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

  3. Matteo L

    Aug 9 Pre-Release Testers Europe (Montebelluna (TV), Ita...

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

    Ciao @Antonio R , 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"
  4. Ercole G

    Aug 9 Pre-Release Testers, Xojo Pro

    Hai provato con :

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

    prima che ci siano caratteri strani che fanno casino ?

    Luciano

  5. Matteo L

    Aug 9 Pre-Release Testers Europe (Montebelluna (TV), Ita...

    @Ercole G Hai provato con :

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

    prima che ci siano caratteri strani che fanno casino ?

    Luciano

    Provato ora, purtroppo continua a non funzionare.

    Grazie

  6. Ercole G

    Aug 9 Pre-Release Testers, Xojo Pro
    Edited 3 months ago

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

  7. Matteo L

    Aug 9 Pre-Release Testers Europe (Montebelluna (TV), Ita...

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

  8. Ercole G

    Aug 9 Pre-Release Testers, Xojo Pro

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

  9. Matteo L

    Aug 9 Pre-Release Testers Europe (Montebelluna (TV), Ita...

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

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

  10. Pietro B

    Aug 9 Pre-Release Testers, Xojo Pro Europe (Swiss, Chiasso)

    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?

  11. Matteo L

    Aug 10 Pre-Release Testers Europe (Montebelluna (TV), Ita...

    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.

or Sign Up to reply!