Я начинаю создавать свое первое многопоточное приложение, используя библиотеки QT.
Следуя руководству qt о QTcpServer и QTcpSocket, я написал серверное приложение, которое создает соединение с этим конструктором:
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()));
}
Это функция incomingConnection(), которая создает новый поток каждый раз, когда новый клиент пытается подключиться:
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.";
}
Теперь это 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::QtQObject::connect: Cannot connect (null)::readyRead() to QThread::dataAvailable()
0);
if (blockSize == 0) {
if (tcpSocket->bytesAvailable() < (int)sizeof(qint16))
return;
in >> blockSize;
}
if (tcpSocket->bytesAvailable() < blockSize)
return;
QString string;
in >> string;
//[...]
}
Код компилируется нормально, но когда я запускаю клиент (после запуска сервера), я получаю следующую ошибку на сервере:
QObject::connect: Cannot connect (null)::readyRead() to QThread::dataAvailable()
Тогда сервер не может получить данные от клиента.
Кто-нибудь знает?
заранее спасибо Даниэле
socket
принадлежит первому потоку, и вы передаете его через вновь созданный поток, а внутри вы делаетеtcpSocket = new QTcpSocket();
, который, похоже, не может перераспределить данные вне текущего потока. - person sorush-r   schedule 23.05.2012tcpSocket = new QTcpSocket();
, а затемtcpSocket = socket;
. Почему??? Почему ты бы так поступил?? - person dschulz   schedule 23.05.2012QTcpServer
, когда наследуете его? это неловко!! я не упоминаю другие проблемы, потому что кто-то уже сказал вам... много изменений не повод оставлять в коде такой мусор! - person andrea.marangoni   schedule 23.05.2012