Seite 1 von 1

[gelöst] multithreaded TCP-Server core dump

Verfasst: 12. März 2008 07:53
von beyama
Ich bin Anfänger im Bereich C++ und QT also verzeiht mir bitte dumme Fehler.
Ich übe mich gerade an einem multithreaded TCP-Server und habe ein Problem mit zwei Klassen. Eine ist abgeleitet von QTcpSever, darin ist die "incomingConnection()" Methode überscrieben.

Code: Alles auswählen

void C2S::incomingConnection(int socketDescriptor) {
     C2SSession *session = new C2SSession(socketDescriptor, this);
     connect(session, SIGNAL(finished()), session, SLOT(deleteLater()), Qt::DirectConnection);
     session->start();
}
Die zweite Klasse, C2SSession, ist abgeleitet von QThread die "run()" methode sieht so aus:

Code: Alles auswählen

void C2SSession::run() {
  client = new QSslSocket();
  client->setProtocol(QSsl::TlsV1);
  if (!client->setSocketDescriptor(socketDescriptor)) {
  	emit error(client->error());
  	delete client;
  return;
  }
  client->setLocalCertificate("./mycert.pem");
  client->setPrivateKey("./mycert.pem");
  client->ignoreSslErrors();

  connect(client, SIGNAL(readyRead()), SLOT(readyRead()), Qt::DirectConnection);
  connect(client, SIGNAL(disconnected()), SLOT(disconnected()), Qt::DirectConnection);
  connect(client, SIGNAL(sslErrors(const QList<QSslError>&)), SLOT(sslErrors(const QList<QSslError>&)), Qt::DirectConnection);
  connect(client, SIGNAL(encrypted()), SLOT(encrypted()), Qt::DirectConnection);
  
	handler = new C2SXmlHandler(this);
	
	connect(handler, SIGNAL(streamStart()), SLOT(streamStart()), Qt::DirectConnection);
	connect(handler, SIGNAL(startTls()), SLOT(startTls()), Qt::DirectConnection);
	
	reader 	= new QXmlSimpleReader();
	source 	= new QXmlInputSource(client);
	reader->setContentHandler(handler);
	reader->setErrorHandler(handler);
	reader->setFeature("http://xml.org/sax/features/namespace-prefixes", true);
	reader->parse(source, true);
	
  exec();
}
Wenn nun ich den Thread beende und im Deconstructor das Socket-Objekt lösche gibt es einen Core Dump.

ASSERT failure in QCoreApplication::sendEvent: "Cannot send events to objects owned by a different thread. Current thread 8052280. Receiver '' (of type 'QSslSocket') was created in thread 805fcd8", file kernel/qcoreapplication.cpp, line 269
Aborted (core dumped)

Kann mir jemand sagen wo mein Denkfehler ist?

Verfasst: 12. März 2008 08:20
von Christian81
client wurde im zweiten Thread erzeugt, Du löschst es aber im Hauptthread - das ist nicht erlaubt.

Verfasst: 12. März 2008 11:00
von beyama
Vielen Dank für die schnelle Antwort. Das hat mir sehr geholfen.
Ich lösche nun meine Objekte hinter dem "exec()" Aufruf in "run()", funktioniert wunderbar.

Mir ist allerdings nicht klar warum es kein Problem war die anderen drei Objekte
die ich in "run()" angelegt habe im Decontrutor zu löschen.

Verfasst: 12. März 2008 12:14
von Christian81
So wie es aussieht sendet QSslSocket noch ein paar Signals, die allerdings vom falschen Thread aus. Die anderen Objekte machen das nicht und deshalb auch kein check ob es im richtigen Thread ist.