La connexion (dans un projet QT) ne fonctionne pas
-
13-12-2019 - |
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
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.