Thread-Problem

  • VB.NET

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

    Thread-Problem

    yo ihrs,

    hab mal eine kleine Frage zum Threading. Hab mir das bei Galileo mal angegeuggt und auch im Forum bisschen gestöbert.
    Hab das mal probiert zum umsetzen und nun folgenden Fehler "Ungültiger threadübergreifender Vorgang: Der Zugriff auf das Steuerelement conMain erfolgte von einem anderen Thread als dem Thread, für den es erstellt wurde."

    Zum Programm: Ich will mittels WMI Infos auslesen (funkt auch). Allerdings braucht er einfach beim Prozessor ein bisschen länger (is auch ok).
    Anzeigen tu ich das ganze per ContextMenuStrip.

    der sub zum Laden der Daten geschieht im Load Event. Wenn man nun das Programm startet und das Kontext-Menü aktiviert sieht man schon die Mainboard Bezeichnung aber wenn der dann den Prozessor auflisten will (während das Menü offen ist) kommt der oben genannte Fehler.

    habe nun dazu 2 Fragen:
    - Hab im Forum etwas über Invoke und Delegates gelesen. Wie funktionieren diese Methoden bzw wendet man diese richtig an?
    - Ist der Code dazu dann soweit richtig? (siehe unten)
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub doFillConMainHardware()
    2. '*** Hardware-Infos befüllen ***
    3. tsmiMotherboardBezeichnung.Text = doGetHardwareInfo("Win32_BaseBoard", "Manufacturer") & _
    4. " " & doGetHardwareInfo("Win32_BaseBoard", "Product") 'Mainboardname auslesen
    5. tsmiProzessorBezeichnung.Text = doGetHardwareInfo("Win32_Processor", "Name") 'Prozessor
    6. tsmiArbeitsspeicherBezeichnung.Text = CStr(Double.Parse((My.Computer.Info.TotalPhysicalMemory / 1073741824).ToString("##0.00")) & " GB") 'Arbeitsspeicher
    7. tsmiGrafikkarteBezeichnung.Text = doGetHardwareInfo("Win32_VideoController", "Name") 'Grafikkarte
    8. End Sub
    9. 'im Load Event:
    10. Dim bgHWInfoFill As New Thread(AddressOf doFillConMainHardware)
    11. bgHWInfoFill.IsBackground = True
    12. bgHWInfoFill.Start()



    lg
    Werte eines dargestellten Controls können nur in dem Thread, in dem sie erstellt wurden, verändert werden.
    Mache einfach folgendes:

    VB.NET-Quellcode

    1. Delegate Sub ProcessAppendText(ByVal txt As String)
    2. Private Sub AppendText(ByVal txt As String)
    3. If (TextBox1.InvokeRequired) Then
    4. ' Aufruf aus anderem Thread
    5. Dim d As New ProcessAppendtxt(AddressOf Appendtxt)
    6. TextBox1.Invoke(d, txt)
    7. Return
    8. End If
    9. TextBox1.Text &= txt
    10. End Sub

    Aufgerufen wird

    VB.NET-Quellcode

    1. AppendText("jklghklg")

    Das musst Du dann noch an Deine Funktionen anpassen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hi.

    fichz schrieb:

    Hab im Forum etwas über Invoke und Delegates gelesen. Wie funktionieren diese Methoden bzw wendet man diese richtig an?

    Lies dazu diesen sehr informativen MSDN-Artikel: msdn.microsoft.com/de-de/library/ms171728.aspx

    fichz schrieb:

    Ist der Code dazu dann soweit richtig?

    Ist in Ordnung, sofern du die Eigenschaften mit einer Wrapper-Methode versiehst, die dir Threadsicherheit garantiert (siehe Artikel und den Post über mir). Du kannst auch eine generische Methode schreiben, damit du nicht für jedes Control und jede Eigenschaft eine eigene brauchst. Benutze dafür die Member auf System.Reflection.* .
    Gruß
    hal2000
    Aha, seit ich schreibe haben bereits andere geantwortet, ich lass trotzdem mal den Link da, weil ich finde, dass diese Seite Interessantes beinhaltet.

    der-softwareentwickler-blog.de…net-und-backgroundworker/


    Ich habe für das Problem folgenden Code zusammengeschrieben.
    Da ich denke, dass es sich hierbei nicht um ein Verschlüsselungstool handelt gehe ich davon aus, dass es nicht stört, wenn eine temporäre Datei erstellt wird und anschließend sofort wieder gelöscht wird. Es ist dennnoch nicht sehr schön.

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub Start() Handles Button1.Click
    2. BackgroundWorker1.RunWorkerAsync()
    3. End Sub
    4. Private Sub InfosAuslesen() Handles BackgroundWorker1.DoWork
    5. Call InfosAuslesen()
    6. End Sub
    7. Private Sub InfosAuslesen()
    8. 'Das ist dann einfach das, was so lange benötigt
    9. 'For i As Integer = 0 To 1000
    10. ' For j As Integer = 0 To 1000
    11. ' Next
    12. 'Next
    13. IO.File.WriteAllText(My.Computer.FileSystem.SpecialDirectories.Temp & "\ProcessorInfo.txt", "Prozessortyp und solche Sachen halt")
    14. End Sub
    15. Private Sub Finish() Handles BackgroundWorker1.RunWorkerCompleted
    16. TextBox1.Text = IO.File.ReadAllText(My.Computer.FileSystem.SpecialDirectories.Temp & "\ProcessorInfo.txt")
    17. IO.File.Delete(My.Computer.FileSystem.SpecialDirectories.Temp & "\ProcessorInfo.txt")
    18. End Sub

    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Niko Ortner“ ()

    Du brauchst Delegaten. Ansonsten kannst du diesen Fehler gewaltsam über den Befehl

    VB.NET-Quellcode

    1. CheckForIllegalCrossThreadCalls = False

    ignorieren, was aber eher unsauber ist. Erkundige dich nach Delegates oder Invoke, da findest du eine Menge :)

    //EDIT: arrgh, da haben ja schon mehrere gepostet... komischerweise hat das Absenden meines Postings nicht funktioniert ...


    link_275
    Hello World
    vielen dank erstmals für die rückmeldungen.
    @Rod: Den Code hatte ich in ähnlicher Form schon wo gefunden. Würde aber gerne wissen was der macht.
    - Was ist ein "Delegate" und was ist "Invoke". Würde das ganze gerne verstehen, da ich ungern Code in in meinem Programm habe den ich nicht kapier was da passiert
    @hal: den artikel hab ich gelesen aber ansich das selbe Problem, dass zwar dort steht wies geht aber nicht was genau was bewirkt :)
    @Niko: BGW will ich nicht unbedingt verwenden, da ich gerade dabei bei mich in das Thread-Thema einzuarbeiten.
    @Link: das "CheckForIllegalCrossThreadCalls = False" hab ich gefunden, aber gelesen, dass man das nicht verwenden soll :)

    sonst gugg ich mir mal im internet um, ausser es hat jemand die güte mir das ganze zu erklären :)

    danke an alle
    lg