[gelöst] signal kommt nicht an

Alles rund um die Programmierung mit Qt
Antworten
kurbel
Beiträge: 5
Registriert: 5. Januar 2011 18:52

[gelöst] signal kommt nicht an

Beitrag 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
Zuletzt geändert von kurbel am 6. Januar 2011 12:35, insgesamt 1-mal geändert.
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Konsolenausgabe, Rückgabewert vom connect?
kurbel
Beiträge: 5
Registriert: 5. Januar 2011 18:52

Beitrag von kurbel »

der rueckgabewert is 'true' und auf der konsole gibt es keinerlei anzeichen, dass das connect fehlgeschlagen sein koennte
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Dann funktioniert der connect aus. Wird das Signal überhaupt ausgelöst? Minimal kompilerbares Beispiel bitte ...
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
kurbel
Beiträge: 5
Registriert: 5. Januar 2011 18:52

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

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

'Funktioniert nicht' ist keine Fehlerbeschreibung
kurbel
Beiträge: 5
Registriert: 5. Januar 2011 18:52

Beitrag 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
Dateianhänge
PDT.tar.gz
(1.33 KiB) 72-mal heruntergeladen
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

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

'Funktioniert nicht' ist keine Fehlerbeschreibung
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag 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();
}
kurbel
Beiträge: 5
Registriert: 5. Januar 2011 18:52

Beitrag von kurbel »

oh mann
wie recht du doch hast.
darauf haett ich aber auch echt selber kommen koennen.
naja egal.
danke fuer eure hilfe :)
Antworten