Slot reagiert nicht auf Signal

Alles rund um die Programmierung mit Qt
Antworten
Baz
Beiträge: 67
Registriert: 22. August 2007 14:21

Slot reagiert nicht auf Signal

Beitrag 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?
kitov
Beiträge: 36
Registriert: 29. November 2006 12:24

Re: Slot reagiert nicht auf Signal

Beitrag von kitov »

ich glaube header und implementation muessen getrennt sein .
Baz
Beiträge: 67
Registriert: 22. August 2007 14:21

Beitrag von Baz »

sind sie im originalcode. hab ich nur hier nicht gemacht damit es kürzer ist
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag 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.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Baz
Beiträge: 67
Registriert: 22. August 2007 14:21

Beitrag von Baz »

hab beide möglichkeiten getestet...geht auch nicht
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Schreib ein kleines (kompilierfähiges) Beispiel, häng es an und wir schauen.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Baz
Beiträge: 67
Registriert: 22. August 2007 14:21

Beitrag von Baz »

ich hab es anstatt mit einer queued connection mit einer DirectConnection versucht damit geht es!
Macht das sinn?
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag 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.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Baz
Beiträge: 67
Registriert: 22. August 2007 14:21

Beitrag 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??
Dateianhänge
Archiv.rar
(906 Bytes) 166-mal heruntergeladen
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Habe ich doch nun schon gesagt - siehe meinen letzten Post.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Baz
Beiträge: 67
Registriert: 22. August 2007 14:21

Beitrag 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.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag 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
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Baz
Beiträge: 67
Registriert: 22. August 2007 14:21

Beitrag 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
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Ggf. hilft es eine eigene QEventLoop zu erzeugen und ab und zu zu pollen.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Antworten