(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()));
}
이것은 새 클라이언트가 연결을 시도할 때마다 새 스레드를 생성하는comingConnection() 함수입니다.
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