连接(在 QT 项目中)不起作用
-
13-12-2019 - |
题
我开始使用 QT 库创建我的第一个多线程应用程序。
按照有关 QTcpServer 和 QTcpSocket 的 qt 指南,我编写了一个服务器应用程序,使用此构造函数创建连接:
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()));
}
这是 iningConnection() 函数,每次新客户端尝试连接时都会创建一个新线程:
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::Qt_4_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()
那么服务器就无法接收客户端的数据。
有人有什么主意吗?
预先感谢Daniele
解决方案
socket = this->nextPendingConnection();
应该:
socket = server->nextPendingConnection();
因为你正在使用 server
会员与非会员 this
作为主动的 QTcpServer
, , 班上 Connection
甚至不应该继承 QTcpServer
, ,但仅来自 QObject
.
另外,你也滥用了 QThread
. 。你应该阅读 跨线程的信号和槽, ,并且可能 线程和 SQL 模块, , 如果 Db
正在使用 QtSql 模块。
不隶属于 StackOverflow