Multithreading Posten von Events von Thread zu Thread.

Alles rund um die Programmierung mit Qt
Antworten
nando
Beiträge: 321
Registriert: 28. Oktober 2004 13:16

Multithreading Posten von Events von Thread zu Thread.

Beitrag von nando »

Hi,
Ich habe gerade das Problem, dass ich aus einem thread heraus
ein Event an ein Widget posten will, dieses aber nicht beim Widget ankommt.

Meine Thread Klasse ist von QThread abgeleitet und aus der run methode rufe ich
QCoreApplication::postEvent(targetWidgetPtr, MyCustomEvent);
auf...

targetWidgetPtr ist gueltig und verweis auf das zu empfangende Widget., MyCustomEvent ist von QCustomEvent abgeleitet.
das targetWidget reimlementiert
void customEvent (QEvent*)....

habe es auch schon mit bool event(QEvent *) probiert...
aber das event kommt hier nie an..

Muss fuer den Thread die eventloop explicit gestartet werden, auch dann, wenn ich wie in meinem fall postEvent fuer die QCoreApplication thread aufrufe ?

Wenn ich exec fuer den Thread aufrufe geht es gar nicht....

einer eine Ahnung was das sein kann?

Stay tuned,
Nando
ArneStocker
Beiträge: 300
Registriert: 3. November 2004 16:15
Wohnort: Berlin

Beitrag von ArneStocker »

hi nando

grundsätzlich ist PostEvent threadsicher (steht so auch in der Doku) allerdings muss beim Compilieren das Flag QT_THREAD_SUPPORT gesetzt sein.

Du muss das event mit new auf dem Heap erzeugen und dann einen Zeiger auf das event an die Eventschleife übergeben, das sollte eigentlich funktionien.

Code: Alles auswählen

QMyCustumEvent *pMyEvent = new QMyCustomEvent();
pMyEvent->.. blabla
qApp->postEvent(pTargetWidget,pMyEvent); // kein Delete für pMyEvent aufrufen
gruss Arne
nando
Beiträge: 321
Registriert: 28. Oktober 2004 13:16

Beitrag von nando »

Hi Arne,

danke fuer den Hinweis....
Allerdings nutze ich QT4 beta1 und da ist der thread support standardmaessig dabei.

Es funktioniert mittlerweile.... auch ohne den event loop des threads explizit zu starten. dieser wird scheinbar nur benoetigt um selber events zu emfangen und zu posten.... da ich aber die qApp->postEvent
bzw. QT4: QCoreApplication::postEvent() aufrufe geht das senden des events ueber die main loop... die ja dann scheinbar thread save sein muss / sollte...

Gruss,
Nando
Antworten