Multithreading Vorschlag

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

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Multithreading Vorschlag

    Hallo Zusammen

    Ich beginne mich gerade in Multithreading ein zu arbeiten.
    Nun wollte ich euch fragen ob Ihr mir einen Vorschlag für ein Beispielprojekt habt wo ich Multithreading sinvoll anwenden kann.

    Vielen Dank für eure Vorschläge!

    Lingo

    EDIT:

    Möge ein Moderator doch bitten das Thema in das richtige Unterforum verschieben.
    Beim erstellen des Themas war ich der Meinung, dass es in den OffTopic gehört.
    Jedoch scheint dies beim weiteren Verlauf nicht so zu sein :)

    Edit by Manschula:
    Thema verschoben

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

    @Lingo Fang an mit einem Zähler, zählen und Anzeige, wobei die GUI nicht belastet wird.
    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!
    Habe es versucht:

    Quellcode: vb.net

    1. Public Class Form1
    2. Public Sub count()
    3. For i As Integer = 0 To 1000000000 Step 1
    4. i += 1
    5. Next
    6. End Sub
    7. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    8. Dim thread As New System.Threading.Thread(AddressOf count)
    9. thread.Start()
    10. End Sub
    11. End Class


    Habe es auch getestet;
    - Wenn ich es so mache wie im obrigen Code (also mit Threading) erscheint das GUI gleich.
    - Wenn ich die For Schleife im Load Event mache erscheint das GUI verzögert.

    Ich glaube den nutzen von Threading dadurch verstanden zu haben.

    Nun eine weitere Frage:
    Ich möchte i beim hochzählen in einem Label anzeigen lassen.
    Macht man die Anzeige im neuen Thread oder im Load Event?

    Vielen Dank für eure Antworten.

    Lingo schrieb:

    im Load Event
    machst Du gar nix.
    Starte den Thread mit Button_Click und zeig die Zahl mit Me.Invoke(Sub() Label1.Text = i.ToString) an.
    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!
    @RodFromGermany

    Vielen DAnk! Mein jetztiger Code:

    Quellcode: vb.net

    1. Public Class Form1
    2. Public Sub count()
    3. For i As Double = 0 To 1000000000 Step 0.1
    4. Me.Invoke(Sub() Label1.Text = i.ToString)
    5. i += 1
    6. Next
    7. End Sub
    8. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    9. Dim thread As New System.Threading.Thread(AddressOf count)
    10. thread.Start()
    11. End Sub
    12. End Class


    Kannst du mir sagen was das Sub() bei Invoke macht?
    Hab die Erklärung des Visual Studios gelesen und wollte deswegen Sub() mit count() ersetzten jedoch habe ich bemerkt, dass dies falsch ist.
    Soweit ich das durchblickthabe rufst du durch das Invoke eine auf also:

    Quellcode

    1. Sub
    2. Label1.text = i.Tostring
    3. End sub
    There is no CLOUD - just other people's computers

    Q: Why do JAVA developers wear glasses?
    A: Because they can't C#

    Daily prayer:
    "Dear Lord, grand me the strength not to kill any stupid people today and please grant me the ability to punch them in the face over standard TCP/IP."

    Lingo schrieb:

    Ich glaube den nutzen von Threading dadurch verstanden zu haben.

    Nun eine weitere Frage:
    Ich möchte i beim hochzählen in einem Label anzeigen lassen.
    das möchtest du nicht.
    Kein Mensch verfügt über soviel Lebenszeit, um einem Zähler von 0 - 100000000 in einem Label zuzuschauen.
    Diese Erkenntnis gehört bischen mit zum Verständnis von Threading.

    Aber das ist vlt ein ausgezeichneter Einstieg:
    Was ist der Nutzen von Nebenläufigkeit (Threading) (es gibt deren nämlich mehrere)?
    • Gui entblocken: eine zeitraubende Arbeit (Job) im Nebenthread blockiert nicht das Gui
    • u.U. Zeitersparnis: manche Jobs können aufgeteilt werden. Das ist aber nur soweit sinnvoll, wie physikalische Worker verfügbar sind. Etwa 4 Kernel, oder ein Inet-Server beantwortet eh nur 2 Anfragen parallel.
    • viele unterschiedlich lange Jobs können gepuffert verarbeitet werden (Producer/Consumer - Pattern)
    Und nächste Frage ebenso wichtig:
    Was sind die Fußfallen bei Nebenläufigkeit?
    • Jobs müssen erstmal im Code identifiziert bzw. erstmal durch Code-Design in geeignete Form gebracht werden.
    • Die Job-Ergebnisse können nicht sofort weiterverwendet werden (sondern sie werden ja erst noch im Nebenthread berechnet)
    • das Gui darf nur aus dem MainThread zugegriffen werden
    • Das Gui muß während der Thread-Laufzeit teilweise disabled werden
    • Falls Exceptions auftreten ist ein besonderes Handling erforderlich
    • Vorkehrungen, falls der User die Anwendung ganz schließt, noch während ein Thread läuft