문제

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 모듈을 사용하고 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top