簡體   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