Threadübergeifender Zugrif

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von zoranmaric.

    Threadübergeifender Zugrif

    Hallo .

    Habe dieses Beispiel:

    VB.NET-Quellcode

    1. Public wert As Byte = 0
    2. Private Sub Thred1()
    3. Dim Thread1 As New Thread(Sub()
    4. Do While (wert = 0)
    5. ' mach was ....
    6. Loop
    7. Beep()
    8. End Sub)
    9. Thread1.IsBackground = True
    10. Thread1.Priority = ThreadPriority.Normal
    11. Thread1.Start()
    12. End Sub


    Ist es so Threadsicher auf eine Variable aus einen andern Thread zuzugreifen?
    Daten kann ich mit Hilfe von Delegaten übergeben aber wie is es wenn ich Daten auslesen will die nicht im selben Thread sind?

    Danke für eure Hilfe. :)

    zoranmaric schrieb:

    Daten
    die nix mit GUI-Controls zu tun haben, kannst Du einfach so auslesen, andernfalls über Invoke / BeginInvoke.
    Ich empfehle Dir als Thfread-Prozedur keine anonyme, sondern eine explizite Methode, da bekommst Du qualifiziertere Fehlermeldungen.
    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!
    Hier eine Art Anker: Controls Threadsicher machen
    Da ist viel diskutiert, und ist auch auf diverse Beispiele verlinkt.

    Wobei, heutzutage, unterm Async-Pattern geht man ja anders vor: Async, Await und Task

    Ach, nochmal genauer auf deine Frage:
    Ja, das kann man so machen. Also du scheinst wert ja nur als Abbruch-Bedingung zu nutzen, und ob der Loop da nun paar Runden zuviel rennt, weil die Threads nicht exakt synchronisieren ist schnuppe.
    Kann man sogar auch noch optimiern, aber kostet dann bisserl Performance.

    Die Rede von Daten mit Delegaten übergeben und Daten, die im anderen Thread sind, verstehe ich nicht recht.
    Daten sind eiglich nicht in einem Thread.
    Ein Thread kann auf Daten zugreifen, und Probs entstehen meist, wenn mehrere Threads auf dieselben Daten zugreifen.
    Aber muss man halt konkret hinschauen.
    Hier, das mit wert ist genau so ein Fall, wo mehrere Threads lesend/schreibend auf wert zugreifen mögen, und das schlimmste was passieren kann, ist, dass der loop paar Runden mehr läuft als er eiglich müsste.

    Aber mit anderen Daten, insbesondere mit Auflistungen, mag das ganz anders aussehen.
    Und noch insbesonderer mit Controls jeder Art ist es höchst heikel, und darauf gehen halt meine Links v.a. ein.

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Danke. :)

    Hatte an das gedacht:

    VB.NET-Quellcode

    1. Public Delegate Function Del(ByVal txt As String)
    2. Public Function Label(ByVal txt As String)
    3. Me.Label1.Text = txt
    4. Return Nothing
    5. End Function
    6. Private Sub Thred_2()
    7. Dim Thread_1 As New Thread(Sub()
    8. Dim s As String = "ok"
    9. Me.Invoke(New Del(AddressOf Label), New Object() {s})
    10. End Sub)
    11. Thread_1.IsBackground = True
    12. Thread_1.Priority = ThreadPriority.Normal
    13. Thread_1.Start()
    14. End Sub


    Wert übergeben über den Delegaten. Mir wass es nicht so richtig klar wie es umgekeht ging. :(

    Also muss ich warten bis ich schreiben kann ????

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „zoranmaric“ ()

    ich weiß nicht, was du mit "warten bis ich schreiben kann" meinst, aber vom Prinzip her ist dein Code bisserl umständlich, aber ok.
    (Und BeginInvoke oder Async wären mal wieder besser, aber meine Links liest du ja scheints nicht.)

    Konkret isser natürlich Unfug, weil wer einen Thread startet, nur um mit Invoking wieder zurück-zudelegieren, hat den Witz vonne Nebenläufigkeit noch nicht ganz verinnerlicht.

    Aber es ist sicher nur ein Sample-Code für iwas ganz anneres, nur dieses annere kann auch wieder anners gelagert sein, dass mans dann doch wieder anners machen würde.

    Lange Rede kurzer Sinn: Wirklich konkret hilfreiche Antworten erhält man hier im Forum nur, wenn man auch wirklich konkrete Fragen stellt, also erzählt, was man machen will, und wozu.

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

    ErfinderDesRades schrieb:

    aber meine Links liest du ja scheints nicht
    Deine auch nicht?

    RodFromGermany schrieb:

    Ich empfehle Dir als Thread-Prozedur keine anonyme, sondern eine explizite Methode, da bekommst Du qualifiziertere Fehlermeldungen.

    @zoranmaric Oder hast Du nicht verstanden, was damit gemeint ist?
    Wie immer müssen die jungen Kollegen alles Neue in einer einzigen Prozedur ausprobieren, um sich dann zu wundern, warum nix läuft.
    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!