Threadübergreifend auf Button zugreifen

  • VB.NET

Es gibt 28 Antworten in diesem Thema. Der letzte Beitrag () ist von RushDen.

    Mit Invoke (?) bzw. Delegates.

    VB.NET-Quellcode

    1. 'z.B.
    2. ListView1.Invoke(New MethodInvoker(Sub() ListView1.Items.Clear()))
    Mfg: Gather
    Private Nachrichten bezüglich VB-Fragen werden Ignoriert!


    Hängt sie nur für einen kurzen Moment oder solange wie die Prozedur am laufen ist. Wenn das Letztere der Fall ist dann stimmt etwas nicht.

    Gruß
    Youtube Info Library 2013 jetzt im Showroom.
    Solange wie die Prozedur am laufen ist..Ich poste mal den Code:
    Diese Prozedur soll in einem seperaten Thread ausgeführt werden:


    VB.NET-Quellcode

    1. Private Sub Erstellen()
    2. Me.Invoke(New MethodInvoker(Function() As DialogResult
    3. If Not TextBox1.Text.Length < 1 AndAlso CStr(ComboBox1.SelectedItem) <> Nothing AndAlso TextBox2.Text <> Nothing Then
    4. DerzeitigerName = TextBox2.Text
    5. Dim Passwort(TextBox1.Text.Length - 1) As String
    6. For Buchstabe = 0 To TextBox1.Text.Length - 1
    7. Passwort(Buchstabe) = TextBox1.Text(Buchstabe)
    8. For Zufal = 0 To Zufall - 1
    9. Passwort(Buchstabe) &= Charstring.Chars(ZufallBuchstabe)
    10. If Aktiv = False Then
    11. Entschlüsselungszufall.Add(Zufall)
    12. Aktiv = Not Aktiv
    13. End If
    14. Zufall = ZwischenAbstand.Next(9, 30)
    15. ZufallBuchstabe = Zufallsbuchstabe2.Next(0, Charstring.Length)
    16. Next
    17. Aktiv = Not Aktiv
    18. Next
    19. For Schreiben As Integer = 0 To Passwort.Length - 1
    20. My.Computer.FileSystem.WriteAllText(DerzeitigerPfad & "" & DerzeitigerName & ".txt", Passwort(Schreiben), True)
    21. Next
    22. For Item = 0 To Entschlüsselungszufall.Count - 1
    23. Konventschl.Add(ChrW(Entschlüsselungszufall.Item(Item) * 4))
    24. Next
    25. For Each item In Konventschl
    26. My.Computer.FileSystem.WriteAllText(My.Computer.FileSystem.SpecialDirectories.Temp & "" & DerzeitigerName & "1.txt", item & vbNewLine, True)
    27. My.Computer.FileSystem.WriteAllText(My.Computer.FileSystem.SpecialDirectories.Temp & "\Low" & DerzeitigerName & "1.txt", item & vbNewLine, True)
    28. Next
    29. Konventschl.RemoveRange(0, Konventschl.Count)
    30. Entschlüsselungszufall.RemoveRange(0, Entschlüsselungszufall.Count)
    31. Return MessageBox.Show("Verschlüsselte Datei wurde erstellt")
    32. Else
    33. Return MessageBox.Show("Bitte wähle einen Namen einen Pfad und schreibe deinen Text in die Box, bevor du versucht das Dokument zu erstellen. Ausserdem achte darauf, Dateien die du löschen willst, die aber noch verschlüsselt sind, zu entschlüsseln, bevor du eine neue Datei verschlüsselst.")
    34. End If
    35. End Function))
    36. End Sub
    Du darfst nicht alles in Me.Invoke packen sondern nur das was an die Steuerelemente übergeben werden soll. Und bitte benutze für Sachen in Dateien zu schreiben System.IO.File.... Das ist schöner und du umgehst den My-Namespace
    Youtube Info Library 2013 jetzt im Showroom.
    @ErfinderdesRads
    Weiß jetzt nicht was genau nen synchrones Beispiel ist, aber zum Thema Threads:

    Also das Problem ist eher, dass ich 0 Ahnung hab was Invoke überhaupt macht (bzw Begininvoke(EndInvoke)).
    Hab mir vorher Tutorials zu Threads angeschaut.

    Was ich hinbekomme ist das:

    VB.NET-Quellcode

    1. Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    2. Start()
    3. End Sub
    4. Delegate Sub Test2()
    5. Private Hintergrund As New Thread(AddressOf Test)
    6. Private Sub Test()
    7. 'Anweisungen
    8. End Sub
    9. Private Sub Start()
    10. Hintergrund.Start()
    11. End Sub


    Wenn jetzt bei Anweisungen ein Steuerelement ist, dann kommt halt nen Fehler, dass nicht auf das Steuerelement zugegriffen werden kann.

    Wenn ich das jetzt hierzu ändere:

    VB.NET-Quellcode

    1. Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    2. Start()
    3. End Sub
    4. Delegate Sub Test2()
    5. Private Hintergrund As New Thread(AddressOf Test)
    6. Private Sub Test()
    7. Me.Invoke(New MethodInvoker(Sub() TextBox1.Text = "Hallo"))
    8. End Sub
    9. Private Sub Start()
    10. Hintergrund.Start()
    11. End Sub


    Dann kommt die Fehlermeldung nicht mehr, aber die Anweisung lastet die Form aus.