簡體   English   中英

Qt與信號和插槽並發

[英]Qt Concurrent with signals & slots

我是線程新手,有人建議我使用Qt Concurrent(Qt C ++)。

我正在嘗試使用Qt Concurrent在線程中運行一個函數,我的函數運行良好,但從未發出信號/插槽。

但是,如果我在不使用線程的情況下啟動函數,一切正常,以供您參考。

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    QFutureWatcher<void> *watcher1 = new QFutureWatcher<void>();
    connect(watcher1, SIGNAL(finished()), this, SLOT(getSizeFinished()));

    QString string = "http://ipv4.download.thinkbroadband.com/50MB.zip";
    QFuture<void> future1 = QtConcurrent::run(this, &MainWindow::getRemoteFileSize, string);
    watcher1->setFuture(future1);
}

void MainWindow::getSizeFinished()
{
       qDebug() << "--- FINISHED ---";
}

void MainWindow::getRemoteFileSize(const QString &url)
{
    qDebug() << "Function - getRemoteFileSize";
    QNetworkRequest req;
    m_netmanager = new QNetworkAccessManager();
    req.setUrl(QUrl(url));
    m_reply = m_netmanager->get(req);
    connect(m_reply, SIGNAL(metaDataChanged()), this, SLOT(remoteHTTPHeader()));
}

void MainWindow::remoteHTTPHeader()
{
    qDebug() << "Function - remoteHTTPHeader";
    remoteSize = m_reply->header(QNetworkRequest::ContentLengthHeader).toInt();
    qDebug() << "Remote File Size: " << remoteSize;
    m_reply->deleteLater();
    m_netmanager->deleteLater();
    qDebug() << "SIZE " << remoteSize;
}

在這種情況下,您可能不需要創建連接,可以在m_reply = m_netmanager->get(req);之后m_reply = m_netmanager->get(req);調用MainWindow::remoteHTTPHeader() m_reply = m_netmanager->get(req);

您可能想要檢查回復是否有效完成,如下所示:

if (m_reply->isFinished()) {
    remoteHTTPHeader();
} else {
    connect(m_reply, &QNetworkReply::finished, this, &MainWindow::remoteHTTPHeader);
}

這樣,您可以處理快速和慢速連接。 還要注意我是如何使用函數指針而不是SIGNALSLOT宏創建連接的,這種語法更好,因為它會在編譯時檢查函數是否存在,從而避免產生拼寫錯誤等。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM