CRC32 Prüfsumme berechnen - Geschwindigkeits Problem

  • VB.NET

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von picoflop.

    CRC32 Prüfsumme berechnen - Geschwindigkeits Problem

    Also ich hab ne kleine Funktion zum errechnen der CRC32 Prüfsumme von Dateien geschrieben klappt auch super bei einer Dateien und vielen gleichzeitig, aber sobald die Dateien größer als 75MB sind hängt sich das Programm total auf und geht dann nach wenigen sekunden komplett zu.

    Ist das normal das es bei so großen Dateien länger dauert die Prüfsumme zu errechnen oder könnte etwas anderes das Problem sein ?
    Ich habe nun meinen Code in einen BackgroundWorker gepackt und starte ihn über BW.RunWorkerASync aber dann kommt eine Fehlermeldung sobald er BW startet.

    Fehlermeldung für diese Zeile (lvFiles.Items.Add(ListViewItem))
    Ungültiger threadübergreifender Vorgang: Der Zugriff auf das Steuerelement lvFiles erfolgte von einem anderen Thread als dem Thread, für den es erstellt wurde.
    BackgroundWorker

    VB.NET-Quellcode

    1. Private Sub BW_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BW.DoWork
    2. Dim SFV_File As String() = System.IO.File.ReadAllLines(OFD.FileName)
    3. For Each Line As String In SFV_File
    4. Dim Part As String() = Split(Line, " ")
    5. Dim ListViewItem As New ListViewItem(Part(0))
    6. ListViewItem.SubItems.Add(CRC32.Calculate(GetDirectoryName(OFD.FileName) & "\" & Part(0)))
    7. ListViewItem.SubItems.Add(Part(1).ToUpper)
    8. If CRC32.FileToCRC(GetDirectoryName(OFD.FileName) & "\" & Part(0)) = Part(1).ToUpper Then
    9. ListViewItem.BackColor = Green
    10. Else
    11. ListViewItem.BackColor = Red
    12. End If
    13. lvFiles.Items.Add(ListViewItem)
    14. Next
    15. End Sub


    Bei der Zeile "lvFiles.Items.Add(ListViewItem)" kommt dann die Fehlermeldung
    Du darfst nicht threadübergreifend auf Controls (schreibend) zugreifen!
    Entweder verwendet du Control.Invoke() oder - besser, da das der Vorteil des BW ist - das ProgressChanged event, dass im Ursprungsthread läuft.

    Alternativ ein kleines "threadsafe" sample. Der "Trick" ist die Verwendung des automatisch generierten Delagates "EventName" & "Event". Natürlich darf auch das InvokeTarget keine controls aus einem anderen Thread ansprechen. Wenn man das Event also in einer anderen Klasse handlet, die dann ihrerseits ein Control anspricht, kann dieser Code das nicht feststellen und der Fehler würde in der anderen Klasse auftreten.

    VB.NET-Quellcode

    1. Public Class ThreadEventSample
    2. Public Event Irgendwas(ByVal i As Integer)
    3. Private t As Threading.Thread
    4. Public Sub RunThread()
    5. If t Is Nothing Then t = New Threading.Thread(AddressOf RunInBackground)
    6. If Not t.IsAlive Then
    7. t = New Threading.Thread(AddressOf RunInBackground)
    8. t.Start()
    9. End If
    10. End Sub
    11. Private Sub RunInBackground()
    12. For i As Integer = 1 To 10
    13. For Each d As [Delegate] In IrgendwasEvent.GetInvocationList
    14. If TypeOf d.Target Is Control Then
    15. DirectCast(d.Target, Control).Invoke(IrgendwasEvent, New Object() {i})
    16. Else
    17. RaiseEvent Irgendwas(i)
    18. End If
    19. Next d
    20. Threading.Thread.Sleep(1000)
    21. Next i
    22. End Sub
    23. End Class