Frage

Ich beginne mit der Erstellung meiner ersten Multithread-Anwendung unter Verwendung der QT-Bibliotheken.

Im Anschluss an die qt-Anleitung zu QTcpServer und QTcpSocket habe ich eine Serveranwendung geschrieben, die die Verbindung mit diesem Konstruktor herstellt:

Connection::Connection(QObject *parent) : QTcpServer(parent)
{
    server = new QTcpServer();
    QString ipAddress;

    if (ipAddress.isEmpty())
        ipAddress = QHostAddress(QHostAddress::LocalHost).toString();

    if (!server->listen(QHostAddress(ipAddress),41500))
    {
        qDebug() << "Enable to start server";
        server->close();
        return;
    }

    connect(server,SIGNAL(newConnection()),this,SLOT(incomingConnection()));
}

Dies ist die Funktion incomingConnection(), die jedes Mal einen neuen Thread erstellt, wenn ein neuer Client versucht, eine Verbindung herzustellen:

void Connection::incomingConnection()
{
    QTcpSocket *socket = new QTcpSocket();
    socket = this->nextPendingConnection();

    MyThreadClass *thread = new MyThreadClass(socket, server);
    qDebug() << "connection required by client";
    if (thread != 0)
    {
    connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));
    thread->start();
    }
    else
        qDebug() << "Error: Could not create server thread.";
}

Das ist nun MyThreadClass:

MyThreadClass::MyThreadClass(QTcpSocket *socket, QTcpServer *parent) : QThread(parent)
{
    tcpSocket = new QTcpSocket();
    database = new Db();
    blockSize = 0;

    tcpSocket = socket;

    qDebug() << "creating new thread";
}


MyThreadClass::~MyThreadClass()
{
    database->~Db();
}


void MyThreadClass::run()
{
    qDebug() << "Thread created";
    connect(tcpSocket, SIGNAL(readyRead()), this, SLOT(dataAvailable()));
    exec();
}


void MyThreadClass::dataAvailable()
{
    qDebug() << "data available";
    QDataStream in(tcpSocket);
    in.setVersion(QDataStream::Qt_4_0);

    if (blockSize == 0) {
        if (tcpSocket->bytesAvailable() < (int)sizeof(qint16))
            return;
        in >> blockSize;
    }

    if (tcpSocket->bytesAvailable() < blockSize)
        return;

    QString string;
    in >> string;

    //[...]

 }

Der Code lässt sich gut kompilieren, aber wenn ich einen Client starte (nachdem ich den Server gestartet habe), erhalte ich vom Server die folgende Fehlermeldung:

QObject::connect: Cannot connect (null)::readyRead() to QThread::dataAvailable()

Dann kann der Server keine Daten vom Client empfangen.

Hat jemand eine Idee?

Vielen Dank im Voraus Daniele

War es hilfreich?

Lösung

socket = this->nextPendingConnection();

sollte sein:

socket = server->nextPendingConnection();

weil du das verwendest server Mitglied und nicht this als der Aktive QTcpServer, die Klasse Connection sollte nicht einmal erben QTcpServer, aber nur von QObject.

Außerdem missbrauchen Sie es QThread.Du solltest lesen Signale und Slots über Threads hinweg, und wahrscheinlich Threads und das SQL-Modul, Wenn Db verwendet das QtSql-Modul.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top