C++ connect(在QT项目中)没有';行不通
我开始使用QT库创建我的第一个多线程应用程序 按照关于QTcpServer和QTcpSocket的qt指南,我编写了一个服务器应用程序,用于创建与此构造函数的连接:C++ connect(在QT项目中)没有';行不通,c++,qt,qthread,qtcpsocket,qtcpserver,C++,Qt,Qthread,Qtcpsocket,Qtcpserver,我开始使用QT库创建我的第一个多线程应用程序 按照关于QTcpServer和QTcpSocket的qt指南,我编写了一个服务器应用程序,用于创建与此构造函数的连接: Connection::Connection(QObject *parent) : QTcpServer(parent) { server = new QTcpServer(); QString ipAddress; if (ipAddress.isEmpty()) ipAddress =
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()));
}
然后服务器无法接收客户端的数据
有人知道吗
提前谢谢
达涅利
应该是:
socket = server->nextPendingConnection();
因为您使用的是服务器
成员,而不是此
作为活动的qtcserver
,所以类连接
甚至不应该从qtcserver
继承,而应该只从QObject
继承
此外,您还误用了
QThread
。如果Db
正在使用QtSql模块,您应该阅读,而且可能是这样。我不确定,但我认为socket
属于第一个线程,您正在通过新创建的线程传递它,并且在内部执行tcpSocket=new qtcsocket()代码>似乎无法在当前线程之外重新分配数据。您在哪里学习C++的?你知道关于堆和堆栈的知识吗?你在泄漏内存。另外,您正在手动调用析构函数,而不是使用delete。另一件事是,即使连接到readyRead可以正常工作,您的插槽也会在不同的线程中被调用,而这正是您所期望的。代码中有很多东西需要修复。您还可以提供MyThreadClass声明吗?在您的位置,我将从学习一些C++基础知识(如内存管理)开始。你做了很多错误的事情,我甚至不会去麻烦你的连接问题,直到你得到一些C++基础知识<代码> TCPStute=新QtpCSOCKET()。代码>然后tcpSocket=socket代码>。为什么?你为什么要那样做?你是对的。该代码是许多更改的结果,因此有很多错误…非常抱歉。。。但是,如果取消“tcpSocket=new qtcsocket();”指令,问题不会改变……为什么在继承它时要创建qtcserver
?太尴尬了!!我没有提到其他问题,因为有人已经告诉过你。。。“许多更改”并不是在代码中留下这种垃圾的借口!这个错误来自于C++知识的贫乏。这就是为什么我一开始没有指出的原因。我知道,因为我只学习C++。也许如果我非常了解你C++,那么我就不需要在这里问任何东西了。此外,如果你不想,没有人强迫你回答#亚历克西斯:非常感谢。我知道有很多错误,但是,按照你的建议,现在项目进展得相当顺利。实际上,服务器和客户端按照我的要求进行通信。
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()
socket = this->nextPendingConnection();
socket = server->nextPendingConnection();