Multithreading umsetzung - Paar Fragen Anregungen eurerseits dazu!?

  • Allgemein

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von hal2000.

    Multithreading umsetzung - Paar Fragen Anregungen eurerseits dazu!?

    Hallo liebe VB Community,

    ich arbeite derzeit an einem Programm, welches mehrere Aufgaben nebeneinander aufführen soll.
    Ich habe zum Beispiel 10 Objekte => Äpfel, Birnen, Bohnen usw.

    Nun möchte ich das man für jede dieser Objekte z.B gleichzeit den Preis ermittelt. Habe im moment


    Public Function suche(ByVal such_kriterium As String, ByVal gesuchter_frucht As String,ByVal preis As Integer) As String
    Dim anz as Integer= xxxx

    Return anz

    Diese Funktion möchte ich nun mehremals gleichzeit ausführen. Habe mich da etwas durchs Forum / Google gelesen.

    Gibt ja Threading, Task, Backgroundworker usw.

    Mit THreading habe ich bisher gearbeitet bei einfachen Sub, allerdings bereitet es Probleme bei mir mit den Funktionen.

    Nun meine Frage wie würde man soetwas am besten Umsetzten?

    Habe mehrere Funktionen Preis ermitteln,Suchen, Verkaufen etc. , diese sollten für 1 -30 Objekt möglichst gleichzeitig ablaufen.

    Danke für eure HILFE!
    Hi,
    zuerst mal eine allgemeine Frage. Wie hast du deine "Fruchobjekte" deklariert ? Hast du eine Klasse "Frucht" angelegt ?
    Weil wenn du nun du nun alle Preise aller Früchte haben willst, kannst du einfach mit einer For-Each-Schleife oder LINQ dir die jeweilige Eigenschaft der "Frucht" holen.
    In dem Fall wäre Threading irrelevant. Eigentlich auch wenn du nur den Preis einer Frucht mit einem bestimmten Namen haben willst.
    Also: Überleg dir zuerst ein objektorientiertes Konzept.

    So z.B.
    Klasse

    VB.NET-Quellcode

    1. Option Strict On
    2. Public Class Form1
    3. Public liste As New List(Of Frucht)
    4. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    5. liste.AddRange({New Frucht(10.1D, "Birne"), New Frucht(7.1D, "Apfel")})
    6. MessageBox.Show(Search("Apfel")(0).Preis.ToString())
    7. End Sub
    8. Public Function Search(ByVal name As String) As List(Of Frucht)
    9. Dim l As New List(Of Frucht)
    10. For Each f As Frucht In liste
    11. If f.Name = name Then
    12. l.Add(f)
    13. End If
    14. Next
    15. Return l
    16. End Function
    17. End Class
    18. Public Class Frucht
    19. Public Property Name As String
    20. Public Property Preis As Decimal
    21. Sub New(ByVal p As Decimal, ByVal n As String)
    22. Name = n
    23. Preis = p
    24. End Sub
    25. End Class

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

    Wichtiger Tipp:
    Von Threading immer die Finger von lassen - wenns irgend geht.

    Threads machen ganz vielfältige Probleme, und sind immer wieder für unschöne Überraschungen gut.
    Dabei gibts nur sehr wenig Fälle, wo Threading wirklich angezeigt ist.

    Und von 30 Früchten die Preise zu ermitteln gehört allerhöchstwahrscheinlich nicht dazu.
    So isses.
    Falls Du Schleifen parallelisieren willst, gugst Du Parallel.For.
    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!
    Und falls du dich wirklich für Threading interessierst: Neben dem Objektorientierten Grundkonzept besteht eine vernünftig ge-multithreadete Anwendung aus 4 Komponenten: Initializer, Dispatcher, Worker und Collector.

    Der Initializer stellt zuerst alle erforderlichen Daten in einer Datenstruktur bereit, die effizient parallel bearbeitet werden kann. Die einfachste Form ist ein Array (meinetwegen von Frucht-Objekten).

    Der Dispatcher läuft bereits in einem ersten separaten Thread und tut drei Dinge: 1. Workerthreads erzeugen, 2. Workerthreads mit Arbeit versorgen, 3. Den Collector anweisen, wie die Ergebnisse zusammenzufassen sind (denn der Dispatcher hat die Arbeit auseinandergerissen, der Collector muss es richten).

    Die Worker(threads) bearbeiten die vom Dispatcher zugeteilte Arbeit parallel, z.B. Worker1 bearbeitet Frucht1 bis 10, Worker2 11 bis 20 und Worker3 21 bis 25. Dabei muss sichergestellt werden, dass die bearbeiteten Objekte / Daten unabhängig sind. In den meisten Fällen ist das nicht der Fall, also muss der Zugriff synchronisiert werden. Das ist ein Kapitel für sich, das in Universitäten im Rahmen von Vorlesungen behandelt wird.

    Der Collector sammelt schließlich die Ergebnisse in der richtigen Reihenfolge (!) ein. Das kann der letzte Workerthread, der Dispatcher oder ein weiterer Thread übernehmen. Auch hier muss oft synchronisiert werden.

    Das heißt bei Früchten: Viel Aufwand für wenig Nutzen.
    Gruß
    hal2000