Kommunikation zwischen GUI und thread?
-
Hallo Leute,
ein nich ganz triviales Problem ist der Datenautausch zwischen Threads, was aber noch komplizierter sein kann ist die kommunikation zwischen einem Thread und der GUI. Bsp. der Fortschritt eines Thread und der GUI..
Nehmen wir an Thread X zählt nen zähler hoch, diese soll parallel in der GUI angezeigt werden.
1.Nun könnte ich "umständlicherweise" den Wert aus dem Thread ständig in der GUI bspw. Timer anzeigen. Was wohl nich sin der sache ist.
2. Ich könnte dem Thread nen Window Handle übergeben und dann direkt den wert auf die GUI schreiben und evlt. Paint event aufrufen (weis nich ob das nötig wäre)
Nun die frage an euch.. was ist besser , wie macht man es, gibts ne dritte möglichkeit?
Habe den Trhead deswegen in MFC erstellt, weil die GUI via MFC erstellt wird.
grüß0e
-
Was ist schlecht daran einen Timer zu haben, der in der GUI zyklisch die Daten anzeigt?
Es wird evtl. nicht jede Änderung angezeigt, wenn der Thread schnell ist. Aver interessiert das wen?
Andere Methode ist nur eine Nachricht an die GUI zu posten, wenn neue Infos da sind.Sollte der Thread viele Daten bewegen, dann würde ich zu einer Entkopplung raten. Es macht keinen Sinn wenn der Worker permament auf die lahme UI wartet.
BTW: Man kann kein Paint Event aufrufen, mann kan nur ein Fenster(bereich) invalidieren und diesen neu zeichnen lassen. Aus einen Thread heraus ist InvalidateRect OK, UpdateWindow und RedrawWindow verbieten sich von selbst.
Fenster Operatinen aus anderen Threads sollten tunlichst unterbleiben. Es gibt nur Ärger und Deadlocks...
-
ja gut wenn ich nen Timer habe welcher tyklisch die thread daten abruft, könnte ich doch auc heinfach den Zähler im Timer hochzählen und den thread verwerfen.
Stimmt die möglichkeit ein event an das Fenster zu schicken, dann wäre es ja quasie das gleiceh wie der timer mit seinem timer event... nur das der thread je nach aufgabe nicht zyklisch läuft.
Es geht darum das ich in einem Thread zyklisch die RS232 schnittstelle abfrage bzw. daten lese...damit die GUI nicht hängt wenn auf daten gewartet werden hätte ich ein extra trhead gemacht... die Daten welceh zyklisch gelesen werden sollen in eine Listebox angehängt oder in eine datei geschrieben werden. etc.
Mein Chef meinte ich soll ne gewöhnliche while schleife mit sleep und messageloop verwenden, um syncronisierungsprobleme zu vermeiden.
wie ist es beim Timer, solange ich mich im Timer-Event aufhalte wird der timer deaktiviert und am ende wieder aktivert odeR?