Multithreading Frage

  • VB.NET
  • .NET (FX) 3.0–3.5

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

    Multithreading Frage

    Ich habe ein Form mit einem TabControl, das mehrere Panels besitzt.
    Beispielsweise ein Panel hat ein DataGridView, ein anderes eine Trendanzeige, ein anderes eine Statistikdatenausgabe.

    Meine Daten sind in zwei Arrays global geladen, X-Werte ( Datumswerte ) und Y-Werte ( Messwerte )

    Da die Berechnung der Statistik, sowie die Füllung des DGVs ziemlich dauern, wollte ich versuchen
    diese verschiedenen Teile des Programms in versch. Threads "auszulagern".

    Allerdings weiß ich auch nicht, ob das überhaupt wirklich einen zeitlichen Gewinn bringen würde.

    Die Zuweisung der Daten an das DataGrid erfolgt über ein DataTable, dass als Datasource dient.
    Das ist schon ziemlich schnell, stößt aber bei fast 100000 Werten doch an gewisse Grenzen :rolleyes:

    Ich möchte aber dennoch so viel wie möglich noch an Performance heraus kitzeln.

    Was ich auch schon versucht habe mit Threads, Backgroundworker und Invokes, alles
    hat bis jetzt nicht so geklappt wie ich es erhofft hatte. Leider kenne ich mich hierzu
    auch zu wenig damit aus.

    Hat jemand hierzu Vorschläge, bringt es bei meinem Problem überhaupt etwas,
    kennt jemand gute Links zu diesem Thema? ( Natürlich habe ich selbst schon
    welche gefunden und gelesen, waren aber nicht passend zu meinen Anforderungen)
    Threading bringt weniger Performance, sondern meh UNabhängigkeit. Man lagert etwas in THreads aus, damit die GUI (der MAinthread) in Ruhe arbeiten kann, ohne mit zig Tausend Berechnungen belastet zu sein.
    Zeig mal etwas Code. Oftmals ruiniert die generell die Anzeige von (vielen) Daten die Zeit.
    »There's no need to "teach" atheism. It's the natural result of education without indoctrination.« — Ricky Gervais
    Kurze Anregung: Was bringen mir 100000 Werte in einer DGV? Welcher Nutzer soll da durch blicken?

    Die Aufgabe, dein Control zu zeichnen, kann nur in deinem Hauptthread ausgeführt werden soweit ich weiß.
    Aber die

    Lightsource schrieb:

    die Berechnung der Statistik

    kann man natürlich auslagern, dann wirkt das Programm zumindest nicht so eingefroren.


    ThePlexian schrieb:

    Threading bringt weniger Performance, sondern meh UNabhängigkeit

    Also wenn ich 4 mal Daten habe, dann sind 4 Threads genau so langsam wie einer?

    BGW würde ich so benutzen
    Spoiler anzeigen

    Erstelle zunächst eine Klasse mit deinen Berechnungen:

    VB.NET-Quellcode

    1. Public Class BGWBeispiel
    2. Private Ergebnis As Integer
    3. Public Event Fertig(ByVal i As Integer)
    4. Public Sub LosRechne()
    5. BGW.RunWorkerAsync()
    6. End Sub
    7. Private WithEvents BGW As New System.ComponentModel.BackgroundWorker With
    8. {.WorkerReportsProgress = False, .WorkerSupportsCancellation = False}
    9. Private Sub BGW_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BGW.DoWork
    10. Dim Summand1 As Integer = 5
    11. Dim Summand2 As Integer = 10
    12. Ergebnis = Summand1 + Summand2
    13. End Sub
    14. Private Sub BGW_RunWorkerCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BGW.RunWorkerCompleted
    15. RaiseEvent Fertig(Ergebnis)
    16. End Sub
    17. End Class


    Dann binde die obigen Klasse in dein Beispiel ein, ist ja warhscheinlich eine Form.

    VB.NET-Quellcode

    1. Private WithEvents bgwb As New BGWBeispiel
    2. Private Sub Aufruf()
    3. bgwb.LosRechne()
    4. End Sub
    5. Private Sub HatBerechnet(i As Integer) Handles bgwb.Fertig
    6. Debug.WriteLine(i.ToString)
    7. 'Tu was wenns fertig ist.
    8. End Sub


    ThePlexian schrieb:

    Threading bringt weniger Performance, sondern meh UNabhängigkeit. Man lagert etwas in THreads aus, damit die GUI (der MAinthread) in Ruhe arbeiten kann, ohne mit zig Tausend Berechnungen belastet zu sein.

    Nanü?
    Bist du dir da so sicher?
    Also wenn ich eine Masse Daten berechnen muss, und diese via Threading auf meine 4 Prozessorkerne Verteile, sodaß sie quasi "parellel" berechnet werden bringt das aber (zumindest bei mir) einen Enormen Geschwindigkeitszuwachs.
    Kann doch nicht alles Einbildung sein :P , sondern ist ja auch meßbar.
    Ist in meinen Augen ja auch logisch, da "parallel" also zur gleichen Zeit 4 Dinge, abgearbeitet werden. (Die Zeit für den Verwaltungsaufwand innerhalb der CPU vernachlässige ich jetzt mal)
    @Lightsource Performance bekommst Du durch Parallelisiereung. Gugst Du Parallel.For und Parallel.ForEach.
    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!
    ja, bei 4 Kernen kriegt man - wenn alles gut geht - fast das 4-fache Performance der Berechnung.
    Der Berechnung - wenn die Anzeige lahmt, nützt einem das also einen Fliegendreck.

    Und bei 10000 anzuzeigenden Werten lahmt die Anzeige wahrscheinlich.

    Also bevor man da in übungen mit Threads einsteigt, sollte man testen, wos eiglich hapert - das ist #3 der Rules Of Optimization

    ThePlexian schrieb:

    Threading bringt weniger Performance, sondern meh UNabhängigkeit

    Dieser Satz heißt nicht, dass Multithreading keine Optimierung bringt, nur dass Threading bei dem Freezen der GUI schützt, was viel hilfreicher ist. Ich stimme RFG zu, Performance bekommst du durch Parallel.For
    »There's no need to "teach" atheism. It's the natural result of education without indoctrination.« — Ricky Gervais
    Wie ich schon bei den Flags dieses Threads angegeben hatte handelt es sich um Framework 3.5
    Da ist nichts mit Parallel.For

    Die DGV ist erstaunlich aufnahmefähig und trotzdem noch ziemlich schnell, da gibt es
    nachdem man die Daten gebunden hat, noch keine Probleme.

    Bei einer Trendansicht der Daten verwende ich schon eine dynamisch angepasste Schrittweite,
    die nur so viele Daten zulässt, wie die Anzeige überhaupt darstellen kann.

    Bei der Statistikberechnung muss man leider mit inneinander verschachtelten For/Next
    arbeiten. Da bin ich gerade dabei noch ein wenig zu optimieren.

    Das Einlesen der Arrays braucht Zeit. Ich hatte auch schon mit Listen probiert, aber die
    haben dann andere Nachteile.