[gelöst] multithreaded TCP-Server core dump

Alles rund um die Programmierung mit Qt
Antworten
beyama
Beiträge: 2
Registriert: 11. März 2008 21:11

[gelöst] multithreaded TCP-Server core dump

Beitrag 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?
Zuletzt geändert von beyama am 12. März 2008 11:02, insgesamt 1-mal geändert.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

client wurde im zweiten Thread erzeugt, Du löschst es aber im Hauptthread - das ist nicht erlaubt.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
beyama
Beiträge: 2
Registriert: 11. März 2008 21:11

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

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

'Funktioniert nicht' ist keine Fehlerbeschreibung
Antworten