Seite 1 von 1

Slot reagiert nicht auf Signal

Verfasst: 7. März 2008 15:27
von Baz
Hallo!
Folgender Code beschreibt meine Programmstruktur

class meineKlasse : QThread {

Q_OBCJECT

meineKlasse() {
connect(this,SIGNAL(meinSignal()),
this, SLOT(meinSlot());

emit meinSignal();
}

public slot:
meinSlot() { qDebug() << "Slot aufgerufen"; }

signal:
meinSignal();

void run() {
........
emit meinSignal();
........
}

};

Der Code compiliert und beim verbinden der Slots bekomme ich keine Fehler während der Laufzeit. Eventuelle Syntax Fehler in diesem Beispielcode also einfach übergehen.

Problem:
Wenn ich das SIGNAL im Konstruktor emitte wird der SLOT aufgerufen. Wenn ich das SIGNAL in run() emitte passiert jedoch nichts!!

Was ist falsch?

Re: Slot reagiert nicht auf Signal

Verfasst: 7. März 2008 15:44
von kitov
ich glaube header und implementation muessen getrennt sein .

Verfasst: 7. März 2008 15:49
von Baz
sind sie im originalcode. hab ich nur hier nicht gemacht damit es kürzer ist

Verfasst: 7. März 2008 15:53
von Christian81
Da run() in einem anderen Thread ist, müsste entweder das connect() auch in die run-Methode (so dass alles im Thread abläuft) oder man muss beim connect() angeben dass es eine queued connection werden soll - dann sollte es auch über threadgrenzen hinweg gehen.

Verfasst: 7. März 2008 16:02
von Baz
hab beide möglichkeiten getestet...geht auch nicht

Verfasst: 7. März 2008 16:28
von Christian81
Schreib ein kleines (kompilierfähiges) Beispiel, häng es an und wir schauen.

Verfasst: 10. März 2008 18:38
von Baz
ich hab es anstatt mit einer queued connection mit einer DirectConnection versucht damit geht es!
Macht das sinn?

Verfasst: 10. März 2008 19:05
von Christian81
Also doch zu wenig code bzw. Doku nicht gelesen... http://doc.trolltech.com/4.3/qthread.html#exec
It is necessary to call this function to start event handling.

Verfasst: 13. März 2008 14:58
von Baz
so hier ist jetzt mal das kleine programm dass du wolltest! Es existieren 2 Threads die miteinander über signal und slot kommunizieren sollen. Wenn ich bei beiden Thread in der run Methode keine endlosschleife mache (forever {} auskommentiert) funktionieren bei dem Testprogramm die Signals und Slot. Sobald ich die schleifen allerdings benutzte gehts nicht mehr.
Was muss ich jetzt wo ändern damit es geht??

Verfasst: 13. März 2008 14:59
von Christian81
Habe ich doch nun schon gesagt - siehe meinen letzten Post.

Verfasst: 13. März 2008 15:13
von Baz
das mit dem exec hab ich ausprobiert. Habs an das Ende der run Methode geschrieben. Dann funktioniert die forever schleife aber nicht mehr.

Verfasst: 13. März 2008 15:19
von Christian81
Da korrigiere deinen code - forever() ist nun wirklich nicht die sinnvollste Methode auf etwas in einem Thread zu warten. Busy wait sollte immer vermieden werden das es sonst nur CPU-Zeit frisst

Verfasst: 13. März 2008 15:24
von Baz
eigentlich ist das eher so gedacht, dass der Thread die ganze zeit daten analysiert...also in der forever schleife noch code steht der ausgeführt werden sollen.
Und da der code nicht nur einmal sondern immer wieder ausgeführt werden soll brauch ich die schleife

Verfasst: 13. März 2008 16:38
von Christian81
Ggf. hilft es eine eigene QEventLoop zu erzeugen und ab und zu zu pollen.