Seite 1 von 1

[gelöst] signal kommt nicht an

Verfasst: 5. Januar 2011 21:09
von kurbel
moin zusammen,

ich bin da auf ein problem gestossen, welches ich bisher nicht loesen konnte und nicht einmal eine ahnung habe wies das ueberhaupt auftreten kann. und zwar hab ich 2 klassen erstellt (auszugsweise):

Code: Alles auswählen

class PeerDataServer : public QObject {
	Q_OBJECT

	signals:
		void	ChunkRequested( ChunkMetaData* );
};

void
PeerDataServer::someRandomFunction()
{
	switch( someVar ) {
		case 1:
		{
			qDebug() << "random output";
			emit ChunkRequested( rightVar );
		}
		case 2:	doSomethinElse();
	}
}
und

Code: Alles auswählen

class PeerDataManager : public QTcpServer {
	Q_OBJECT

	private:
		QList<PeerDataServer*>	fActiveAnswers;
	private slots:
		void	_ChunkRequested( ChunkMetaData* );
};

void
PeerDataManager::incomingConnection( int socketDescriptor )
{
	PeerDataServer*		serv = new PeerDataServer( socketDescriptor );

	connect( serv, SIGNAL(ChunkRequested( ChunkMetaData* )),
			this, SLOT(_ChunkRequested( ChunkMetaData* )));

	fActiveAnswers.append(serv);
}
das problem ist, dass entweder das signal in der klasse PeerDataServer nicht richtig ausgeloest wird (was ich mir nicht vorstellen kann) oder der slot in der klasse PeerDataManager dabei nicht getriggert wird. eine debug-ausgabe vor dem ausloesen des signals wird ausgegeben, eine debug-ausgabe direkt am anfang des slots aber nicht.
nun steh ich da und weis nicht weiter. hat jemand ne idee woran das liegen koennte oder wie man der sache weiter auf den grund gehen koennte?

ich waere fuer eine hilfe sehr dankbar
gruesse
Kurbel

Verfasst: 5. Januar 2011 21:26
von upsala
Konsolenausgabe, Rückgabewert vom connect?

Verfasst: 5. Januar 2011 22:10
von kurbel
der rueckgabewert is 'true' und auf der konsole gibt es keinerlei anzeichen, dass das connect fehlgeschlagen sein koennte

Verfasst: 5. Januar 2011 22:14
von Christian81
Dann funktioniert der connect aus. Wird das Signal überhaupt ausgelöst? Minimal kompilerbares Beispiel bitte ...

Verfasst: 6. Januar 2011 11:20
von kurbel
so. hat leider ein klein wenig gedauert das projekt zu minimieren.
habs mal dort hochgeladen:
http://rapidshare.com/files/441076449/PDT.tar
... das signal kommt nach wie vor nicht an

und danke schonmal fuer eure muehen

gruesse
Kurbel

Verfasst: 6. Januar 2011 11:30
von Christian81
Und wo ist die Q(Core)Application? Ohne kann es nichts werden...

/edit: und die 8KB wenn man sie packt passen auch als Anhnang hier ran - da bleibt es dann auch länger erhalten denke ich.

Verfasst: 6. Januar 2011 12:01
von kurbel
oh die hab ich wohl kurzerhand vergessen.
nachdem ich sie eingefuegt hab aendert sich aber leider nichts an der tatsache

... ich hab die "neue" version nochmal angehangen

Verfasst: 6. Januar 2011 12:20
von Christian81
Das WaitForConnection() ist überflüssig. incomingConnection() ist virtual und wird bei jeder neuen Verbindung aufgerufen.
Dein Problem ist aber dass Du im ctor von PeerDataServer() das Signal aufrust aber erst danach das connect() ausführst - das kann nicht gehen.

Verfasst: 6. Januar 2011 12:23
von franzf
Tjo, was erwartest du, wenn du zu einem Zeitpunkt das SIGNAL emittierst, wo noch gar kein SLOT dran hängt?
Kleine Änderung und es geht:

Code: Alles auswählen

	PeerDataServer*		serv = new PeerDataServer( socketDescriptor );

	connect( serv, SIGNAL(ChunkRequested()),
			this, SLOT(on_ChunkRequested()));
	serv->trigger();

/// 
void
PeerDataServer::trigger() {
    emit ChunkRequested();
}

Verfasst: 6. Januar 2011 12:34
von kurbel
oh mann
wie recht du doch hast.
darauf haett ich aber auch echt selber kommen koennen.
naja egal.
danke fuer eure hilfe :)