繁体   English   中英

在发布模式下不调用 Qt 插槽,我归咎于 QSharedPointer

[英]Qt slots are not called in release mode and I blame QSharedPointer

我有信号槽机制的问题,可能是QSharedPointer的问题,因为智能指针对我来说是新的。

上下文的一点解释: TCPAssociation是子类的LANAssociation TCPClient是子类LANClient LANClient有保护QSharedPointer<LANAssociation> connection变量, TCPClient有私有QSharedPointer<TCPAssociation> conn 两者都指向在覆盖的纯虚函数中创建的同一个对象,如下所示:

void TCPClient::startNewConnection(const QHostAddress &address)
{
    conn.clear();
    connection.clear();

    conn = QSharedPointer<TCPAssociation>(new TCPAssociation(address, port, QString("Client %1").arg(hostId())));
    Q_ASSERT(conn);

    Q_ASSERT(connect(conn.data(), &LANAssociation::started, this, &LANClient::assoc_started, Qt::UniqueConnection));

    connection = conn.staticCast<LANAssociation>();
    Q_ASSERT(connection);
    conn->start();
    //TCPAssociation::start() { doStuff(); emit started(); }
}

该代码在调试模式下在 Windows 10 上运行得很好。 在 Linux 上的发布模式下,永远不会调用LANClient::assoc_started

现在我在 Windows 上的 release 中运行了我的服务器应用程序(上面的函数来自客户端应用程序),我可以看到另一个插槽没有在 release 中被调用,但在调试中工作得很好:

void ThreadController::init(ThreadWorker *worker)
{
    worker->moveToThread(&workerThread);

    Q_ASSERT(connect(&workerThread, &QThread::finished, worker, &QObject::deleteLater, Qt::UniqueConnection));
    Q_ASSERT(connect(this, &ThreadController::operate, worker, &ThreadWorker::doWork, Qt::UniqueConnection));
    Q_ASSERT(connect(worker, &ThreadWorker::finished, this, &ThreadController::finished, Qt::BlockingQueuedConnection));
    doConnects(worker);

    workerThread.start();
}

*worker指向ThreadWorker子类。 ThreadWorker::doWork()是虚函数。 它是在调试中调用的,而不是在发布中调用的。 我通过使doWork()纯虚拟来修复它 - 现在它在调试和发布中都被调用。

我也有QTcpSocketQUdpSocket对象不发出connected()readyRead() 现在我明白这可能是因为我使用QSharedPointer<QAbstractSocket>来管理它们,但是:

  1. 为什么调试和发布之间有区别? 如何正确地做到这一点?

  2. 我应该停止使用继承还是共享指针?

  3. 为什么TCPAssociation::started()没有被发出? LANClient::assoc_started也不是虚函数。

Q_ASSERT宏中的表达式不会在非调试构建配置中计算:

Q_ASSERT()可用于在开发过程中测试前置和后置条件。 如果在编译期间定义了QT_NO_DEBUG则它什么也不QT_NO_DEBUG

https://doc.qt.io/qt-5/qtglobal.html#Q_ASSERT

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM