Avatar billede frostholm Praktikant
14. marts 2006 - 18:09 Der er 13 kommentarer og
1 løsning

Behandling af store tekstfiler i threads

Jeg er ved at lave en parser, som læser en log fil som kan svinge i størrelse mellem 5mb og 50mb.

Jeg har lavet et program som har en filedialogopen, som læser igenem filen via en stream reader.

Hver linie behandles så indviduelt.

Det er bare sådan at min application låser, og man holder vidows mens den læser filen (op til 2-3 min).

Kan man ligger denne indlæsning i en thread, og hvordan skal det gøres. Og kan man vise hvor langt man er i filen via en progress bar i sit vindue

Hilsen
Michael
Avatar billede Syska Mester
14. marts 2006 - 18:14 #1
Ja,
Bare start tråden som en Thread.
Hvis du ved hvad linie den er ved, ud af hvor mange, så kan du vide det, eller tror jeg ikke det er muligt.

// ouT
Avatar billede arne_v Ekspert
14. marts 2006 - 18:30 #2
man maa aldrig lave tunge ting i en event

en eller anden form for traad

GUI event + traad + progressbar er postet mange gange for HTTP download
og du skal bare laese log fil fremfor lave HTTP download

(hvis du ikke kan finde eksemplet saa kan jeg finde det)

det er ikke muligt at estimere procent del antal linier, men du kan
estimere procent del antal bytes

progress = (sum(len(linier))+count(linier)*2)/filesize

(hvis du kan se hvad jeg mener)
Avatar billede driis Nybegynder
14. marts 2006 - 18:32 #3
Du kan sagtens processere filen i en thread. Bruger du .NET 2.0 kan du bruge en BackgroundWorker, det er ret nemt at gå til.

Angående progressbar skal du blot finde størrelsen på filen før du påbegynder processering. Hver gang du har læst én eller et helt antal linier, kan du opdatere en progressbar, idet du med en tæller kan holde styr på hvor mange bytes der er læst. Du skal dog huske at du ikke kan opdatere dit UI fra en anden tråd, til dette formål bruges Invoke metoden på en Control. Hvis du bruger BackgroundWorker, findes der en event der kan bruges til opdatering af progress i UI, jeg kan dog ikke lige huske dens navn - men slå det op på MSDN.
Avatar billede dr_chaos Nybegynder
14. marts 2006 - 18:45 #4
hvis du bruger visual c# kan du bruge Backgroundworker.
Den implementerer alt det du har behov for og er bygget til netop dette formål.
Avatar billede frostholm Praktikant
14. marts 2006 - 18:49 #5
jeg bruger visual C# .Net 2.0  Visual Studio 2005

Jeg kigger på backgroundworker, og på udregningerne af progress og vender tilbage hvis jeg ikke helt kan hitte ud af det ...
Avatar billede dr_chaos Nybegynder
14. marts 2006 - 18:53 #6
ok :)
Avatar billede arne_v Ekspert
14. marts 2006 - 19:08 #7
Jeg formoder at BackgroundWorker virker fint med Notepad bare man bruger .NET 2.0

Jeg synes at det er vigtigt at skelne mellem compiler/library funktionalitet
og saa ens udviklingsvaerktoej

Visual Studio er vel klart det bedste udviklings vaerktoej til C#, men
koden virker jo principielt ogsaa i SharpDevelop, Delphi (hvis Borland
har C# i Delphi denne maaned), Notepad eller hulkort
Avatar billede frostholm Praktikant
14. marts 2006 - 19:15 #8
Enig arne, men svarede også bare så folk var bedre rustet til at hjælpe mig.

Jeg har kigget på backgroundworker, og har prøvet at lave et lille windows program som starter en backgroundworker som så skulle skrive i en listbox på min form.

Jeg får her en fejl : cross thread operations ikke tilladt.

i mit log program er jeg nødsaget til at opdarete nogle objecter på baggrund af min fil parsing, er der en løsning på dette

Hilse
Michael
Avatar billede Syska Mester
14. marts 2006 - 19:30 #9
skriver driis hvordan du løser driis 14/03-2006 18:32:50
Avatar billede arne_v Ekspert
14. marts 2006 - 19:36 #10
19:08:28 var til 18:45:35
Avatar billede dr_chaos Nybegynder
14. marts 2006 - 19:47 #11
Her er et simpelt vb eksempel


''' <summary>
''' Tell the worker to fire progress changed events, then start it
''' </summary>
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

  With Me.BackgroundWorker1
      .WorkerReportsProgress = True
      .RunWorkerAsync("C:\temp\bigfile.txt")
  End With
End Sub

''' <summary>
''' This method is where we do the background work. I'm just reading a file as an example.
''' Each time a line is read, we fire a ProgressChanged event and pass the line that was
''' read as an argument.
'''
''' Note that we can't update the UI in the DoWork method, but we can fire events ''' and update the UI in the handler(s) for that event.
''' </summary>
Private Sub BackgroundWorker1_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork

  Dim filename As String = e.Argument

  Using reader As New System.IO.StreamReader(filename)
      While Not reader.EndOfStream
        Me.BackgroundWorker1.ReportProgress(0.0, reader.ReadLine())
      End While
  End Using
End Sub

''' <summary>
''' You can change UI in the ProgressChanged event
''' </summary>
Private Sub BackgroundWorker1_ProgressChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged
  Me.ListBox1.Items.Add(e.UserState)
End Sub

''' <summary>
''' You can also update UI in the RunWorkCompletedHandler
''' </summary>
Private Sub BackgroundWorker1_RunWorkerCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
  MsgBox("Done reading the file!")
End Sub

I BackgroundWorker1_ProgressChanged ændrer han på en listbox.
Her kan du formodentlig ændre dine objekter.
Avatar billede dr_chaos Nybegynder
14. marts 2006 - 19:49 #12
Her er et eksempel i C#.
En bruger som har haft samme problem som dig:
http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=24396&SiteID=1
Avatar billede frostholm Praktikant
20. marts 2006 - 22:16 #13
dr_chaos : Lig et svar og du vil få point. Din løsning virkede perfekt
Avatar billede dr_chaos Nybegynder
21. marts 2006 - 08:06 #14
svar :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester