【问题标题】:The connect (in a QT project) doesn't work连接(在 QT 项目中)不起作用
【发布时间】:2012-05-29 08:46:56
【问题描述】:

我开始使用 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()));
}

这是每次新客户端尝试连接时创建一个新线程的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::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 属于第一个线程,你正在通过新创建的线程传递它,在里面,你正在做 tcpSocket = new QTcpSocket(); 这似乎无法在当前线程之外重新分配数据。
  • 你在哪里学的 C++?你知道堆和栈吗?你在泄漏内存。此外,您手动调用析构函数而不是使用删除。另一件事是,即使连接到 readyRead 可以正常工作,您的插槽也会在您期望的不同线程中被调用。您的代码中有很多需要修复的地方。您还可以提供 MyThreadClass 声明吗?在您的位置上,我将从学习一些 C++ 基础知识(例如内存管理)开始。你做错了很多事情,在你掌握一些 C++ 基础知识之前,我什至不会打扰你的连接问题
  • tcpSocket = new QTcpSocket(); 然后tcpSocket = socket;。为什么???你为什么要这么做??
  • 你是对的。该代码是许多更改的结果,所以有很多错误......很抱歉......但是如果取消“tcpSocket = new QTcpSocket();”指令,问题没有改变......
  • 继承时为什么要创建QTcpServer?很尴尬!!我没有提到其他问题,因为有人已经告诉过你......“许多变化”不是在代码中留下那种垃圾的借口!

标签: c++ qt qthread qtcpsocket qtcpserver


【解决方案1】:
socket = this->nextPendingConnection();

应该是:

socket = server->nextPendingConnection();

因为您使用server 成员而不是this 作为活动QTcpServer,所以Connection 类甚至不应该从QTcpServer 继承,而只能从QObject 继承。

另外,你在滥用QThread。如果Db 正在使用QtSql 模块,您应该阅读Signals and slots across threads,并且可能阅读Threads and the SQL Module

【讨论】:

  • 这个错误来自糟糕的 C++ 知识。这就是为什么我一开始没有指出的原因。
  • #Kamil Klimek:我知道,因为我独自学习 C++。可能如果我像你一样非常了解 C++,那么我就不需要在这里问任何东西了。此外,如果你不想,没有人强迫你回答
  • #alexisdm:非常感谢。我知道有很多错误,但是按照您的建议,现在项目进展顺利。实际上服务器和客户端可以按照我的意愿进行通信。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多