Laden...

TChart - Daten aus einem Thread übergeben - nur wie?

Erstellt von moelski vor 10 Jahren Letzter Beitrag vor 10 Jahren 1.001 Views
Thema geschlossen
M
moelski Themenstarter:in
183 Beiträge seit 2011
vor 10 Jahren
TChart - Daten aus einem Thread übergeben - nur wie?

Moin !

Ich hoffe hier gibt es ein paar TChart Nutzer die evtl. schon mal ein ähnliches Problem hatten (und gelöst haben).
Und zwar geht es um das Eintragen von Daten in Serien aus einem Thread heraus. Mein bisheriges Vorgehen war folgendes:
* Invoke auf Chart um dann für alle Serien ein Clear aufzurufen. Anschließend noch ein AutoRepaint = false
* jetzt (ohne invoke) die Serien mit Daten befüllen (series.Add(...))
* Invoke auf Chart um Autorepaint = true zu setzen und ein Refresh ausführen.

Ich bin mir nicht sicher ob das der richtige Weg ist, aber es funktioniert mal soweit. Nur wenn ich dann während dem Dateneintragen das Fenster mit dem Chart z.B. vergrößere werden die Serien trotz Autorepaint auf false gezeichnet. Und das für die bis dahin eingetragenen Daten.

Ich hatte auch schon den Fall das ein Fokusverlust der Anwendung einen Repaint ausgelöst hat während dem Dateneintragen.

Ich habe dann getestet was passiert wenn ich auch das Dateneintragen über ein Invoke ausführe. Nur leider führt das zu enormen Performance Verlusten.

Dann habe ich versucht die Problematik mittels lock zu lösen:
* Chart.BeforeDraw > Monitor.Enter(_lockObject)
* Chart.AfterDraw > Monitor.Exit(_lockObject)
* Dateneintragen in Serien gekapselt mittels lock(_lockObject){....}
Das funktioniert auch nicht wirklich. Damit ist die ganze Applikation geblockt. Ein Resize des Fensters ist z.B. nicht mehr möglich.

Kurzum, kann mir jemand ein paar Hinweise geben wie ich ein TChart aus einem Thread raus mit Daten füttern kann ohne das meine Anwendung geblockt wird?

PS: Noch frohe Weihnachten

Greetz Dominik

49.485 Beiträge seit 2005
vor 10 Jahren

Hallo moelski,

der Ansatz mit dem lock ist - auch bzw. weil er aus der Not heraus geboren wurde - Quatsch. Das einzig richtige ist, die Ausführung - auch das Füllen mit Daten - an den GUI-Thread zu delegieren. Natürlich muss man dabei [FAQ] Warum blockiert mein GUI? beachten und muss die Gesamtaktion in entsprechend kleinen Häppchen delegieren. Ein Performace-Problem dürfte es dabei nur geben, wenn du kleine Häppchen machst und damit Control.Invoke zu oft aufrufst. Steht aber alles in [FAQ] Controls von Thread aktualisieren lassen (Control.Invoke/Dispatcher.Invoke). Ob es um ein Chart oder ein anderes Control geht, macht hier keinen Unterschied. Genausowenig wie die Frage, ob die Daten gebunden oder gefüllt werden. Alle Zugriffe müssen aus dem GUI-Thread erfolgen.

Bitte beachte [Hinweis] Wie poste ich richtig? Punkt 1.1. Gerade als langjähriges Mitglied solltest du den Top-1-FAQ-Beitrag kennen und berücksichtigen.

herbivore

PS: Ich wurde darauf hingewiesen, dass im Forum für das Chart-Control behauptet wird, dass es - vereinfacht gesagt - reichen würde, Autorepaint auf false zu setzen. Das ist nicht richtig! Es ist wie es in unserer FAQ steht: Alle Zugriffe auf Controls und gebundene Daten müssen aus dem GUI-Thread erfolgen. Und das gilt auch dann, wenn die Anwendung scheinbar korrekt läuft, wenn man diese Regel ignoriert.

Thema geschlossen