CustomEvents in QT4.0

Alles rund um die Programmierung mit Qt
Antworten
Psychodad
Beiträge: 15
Registriert: 26. November 2005 07:30

CustomEvents in QT4.0

Beitrag von Psychodad »

Für das Arbeiten mit mehreren Threads benötigt ich CustomEvents, Ziel ist es aus einem Arbeits-Thread dem GUI Thread mit zuteilen, das neue Daten bereit liegen und diese abgeholt werden können. In QT3 habe ich dafür ein CustomEvent verwendet, dieses wurde mit im Konstruktor mit einer ENUM Konstante "enum{GlobalMessage=1001}" versehen. Dieses "QCustomEvent(GlobalMessage)" wurde dann per postEvent(QCustomEvent(GlobalMessage)) an den GUI Thread übermittelt. In QT4 wollte ich dafür SIgnalSlots verwenden kann. ABER: SIGNAL-SLOTS über Thread Grenzen scheint langsamer zu sein und legt die GUI lahm, beziehungsweise überlastet diese. Da der SLOT sofort ausgeführt wird. Mit QCustomEvents darf der GUI Thread entscheiden wann er das Event verwertet oder ob er überhaupt Zeit hat(Stichwort: accept Drop). Soweit zur Motivation.

Also Ziel ist es ein CustomEvent in QT4 zu verwenden, leider verwaist die QT Docu in diesem Punkt ins nichts und auch forum suchen und google brachte bisher nichts. Eine Class QCustomEvent wie in QT3 gibt es nicht mehr. In der Docu steht sinngemäß, das man sich eine Ableitung von QEvent schaffen soll und eine eigenen ENUM konstruiert irgendwas über 1000. Leider bekomme ich das nicht hin.

Da ich nicht weis wie es im QEvent aussieht habe ich einfach ein eigene Classe angelegt diese ist aber anscheint so leer, das sie nicht im Speicher liegen bleit jedenfalls beschwert sich der Linker das nix da ist. Irgendwie verständlich aber was soll ich da rein schreiben?

class GlobalMessageEvent : public QEvent
{
public:
GlobalMessageEvent();
enum Type{GlobalMessage=1001};
}

GlobalMessageEvent :: GlobalMessageEvent()
{
}

Die Frage in Kurz:
Wie erzeuge ich in QT4 ein QEvent mit einem Type größer 1000, bzw ein aus QT3. bekanntes QCustomEvent.
BartSimpson
Beiträge: 1379
Registriert: 6. November 2004 12:03
Kontaktdaten:

Beitrag von BartSimpson »

In Qt4 kannste du für deine Threads auch Signals nutzten. Das macht Threads viel leichtter als unter Qt3
Psychodad
Beiträge: 15
Registriert: 26. November 2005 07:30

Beitrag von Psychodad »

In QT3 habe ich es mit Events gemacht. In QT4 hatte ich es bereits mit SIgnal-Slot probiert, aber das brachte einige Nachteile.

Im konkreten Beispiel:
GUI Thread mit TextViewer
Arbeitsthread mit vielen Schleifen.

Ziel ist es sehr viele kleine Informationen des ArbeitsThread im TextViewer des GUIThreads darzustellen. Wenn ich dafür Signal-Slot benutze passiert folgendes: Die GUI hängt bzw. ist voll ausgelastet. Erst wen der ArbeitsThread fertig ist bekomme ich alle EInträge auf einen Schlag angezeigt. Warum ist das so? Weil: Der Signal-Slot-Mechanismus sofort ausgeführt wird. Also der ArbeitsThread sendet ein Signal an GUIThread -> der GUIThread verarbeitet den SLOT und versucht sich neu darzustellen. In diesem Moment kommt aber schon das nächste Signal rein usw. Der GUI Thread kommt mit dem Zeichnen einfach nicht nach.

Lösung: Alle Infos werden in einen (BufferThread) geschrieben, der faßt alle einzeiligen QStrings Meldungen des ArbeitsThreads zu einem großen BufferString zusammen. Immer wenn in den BufferString was rein kommt, macht der BufferThread eine Meldung, ein QEvent, an die GUIThread. Der GUIThread bekommt das Event, muss es aber nicht sofort verarbeiten. Erst wenn er Zeit hat, holt er den BufferString ab und löscht ihn. Der BufferString ist dann vllt. schon 10Einträge lang oder 1 Eintrag oder oder...

Das Tolle an dem Mechanismuss ist, das der GUI Thread dynamisch die Anzahl der RePaints anpasst und deswegen beweglich bleibt.

Für diesen Mechanismus benötigt ich aber ein CUSTOM EVENT. Also wie baue ich so etwas?
Zuletzt geändert von Psychodad am 28. November 2005 08:16, insgesamt 1-mal geändert.
BartSimpson
Beiträge: 1379
Registriert: 6. November 2004 12:03
Kontaktdaten:

Beitrag von BartSimpson »

Verstehe.
In der Doku steht schrieben, das der Konstuktor von Qevent den Eventtyp benötigt. Doch das vermisse ich bei deiner Konsturktion.
Ich würde sagen, das es genauso wie unter Qt3 geht. Nur das hier nur noch eine Klasse gibt. Ich hatte unter Qt 3 mal was mit events gebaut. Ich werden mal schauen ob man das einfach nach Qt4 übernehmen kann.
BartSimpson
Beiträge: 1379
Registriert: 6. November 2004 12:03
Kontaktdaten:

Beitrag von BartSimpson »

So habe jetzte mein Rpogramm nach Qt4 convertiert.
Anbei eine Kopie des ganzens.
Psychodad
Beiträge: 15
Registriert: 26. November 2005 07:30

Beitrag von Psychodad »

Danke für die schnelle Antwort. Habe es jetzt genauso wie in deinem Beispiel gemacht und es funktioniert!
Antworten