Question

Je commence à créer ma première application multithread, en utilisant les bibliothèques QT.

En suivant le guide qt sur QTcpServer et QTcpSocket, j'ai écrit une application serveur qui crée la connexion avec ce constructeur :

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()));
}

Il s'agit de la fonction incomingConnection() qui crée un nouveau thread à chaque fois qu'un nouveau client tente de se connecter :

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.";
}

Maintenant, voici 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;

    //[...]

 }

Le code se compile bien mais lorsque je démarre un client (après avoir démarré le serveur), je reçois l'erreur suivante par le serveur :

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

Le serveur ne peut alors pas recevoir de données du client.

Est-ce que quelqu'un a une idée?

Merci d'avance Daniele

Était-ce utile?

La solution

socket = this->nextPendingConnection();

devrait être:

socket = server->nextPendingConnection();

parce que vous utilisez le server membre et non this comme l'actif QTcpServer, la classe Connection je ne devrais même pas hériter de QTcpServer, mais seulement à partir de QObject.

De plus, vous abusez QThread.Tu devrais lire Signaux et emplacements sur les threads, et probablement Les threads et le module SQL, si Db utilise le module QtSql.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top