ich habe mir eine QTcpServer Klasse erstellt die mir die TCP-Connections annimmt.
Bei jeder incomingConnection() wird bei mir ein neuer Thread erstellt und darin das QTcpSocket Objekt erstellt. das funktioniert zwar, ich bekomme aber immer eine Fehlerausgabe der Anwendung.
So wie ich gesehen habe tritt diese Fehlermeldung auf, sobald der SLOT readData() aufgerufen wird, wenn ich da richtig liege.
Fehlermeldung:
Code: Alles auswählen
QObject: Cannot create children for a parent that is in a different thread.
(Parent is QNativeSocketEngine(0x9f17ad0), parent's thread is ServerThread(0x9edcc48), current thread is QThread(0x9ed8338)
Code: Alles auswählen
#include <QThread>
#include <QSslSocket>
#include <QStringList>
#include <QDateTime>
#include <QDebug>
class ServerThread : public QThread {
Q_OBJECT
private:
int socketDescriptor;
QString text;
QTcpSocket *tcpSocket;
public:
ServerThread(QObject *parent = 0);
ServerThread(int socketDescriptor, const QString &fortune, QObject *parent);
void run();
protected slots:
void readClient();
void discardClient();
void readData();
};
ServerThread::ServerThread(QObject *parent) : QThread(parent) {
}
ServerThread::ServerThread(int socketDescriptor, const QString &fortune, QObject *parent) :
QThread(parent), socketDescriptor(socketDescriptor), text(fortune) {
}
void ServerThread::run() {
QTcpSocket *tcpSocket;
tcpSocket = new QTcpSocket();
connect(tcpSocket, SIGNAL(readyRead()), this, SLOT(readData()));
if(!tcpSocket->setSocketDescriptor(socketDescriptor)) {
return;
}
qDebug() << "incoming";
tcpSocket->waitForDisconnected();
}
void ServerThread::readData() {
// This slot is called when the client sent data to the server. The
// server looks if it was a get request and sends a very simple HTML
// document back.
QTcpSocket *socket = tcpSocket;
qDebug() << "readData()";
if(tcpSocket->canReadLine()) {
QStringList tokens = QString(socket->readLine()).split(QRegExp("[ \r\n][ \r\n]*"));
if (tokens[0] == "GET") {
QByteArray block;
block.append("HTTP/1.0 200 Ok\r\nContent-Type: text/html; charset=\"utf-8\"\r\n\r\n<h1>Nothing to see here</h1>\n" + QDateTime::currentDateTime().toString());
tcpSocket->write(block);
qDebug() << "GET";
tcpSocket->close();
}
}
}