Qt Параллельно с сигналами и слотами - PullRequest
1 голос
/ 10 июля 2019

Я новичок в потоках, и кто-то советует мне использовать 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;
}

1 Ответ

0 голосов
/ 10 июля 2019

В этом случае вам, вероятно, не нужно создавать соединение, вы можете позвонить MainWindow::remoteHTTPHeader() сразу после m_reply = m_netmanager->get(req);.

Возможно, вы захотите проверить, действительно ли закончен ответ следующим образом:

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

Таким образом, вы обрабатываете как быстрые, так и медленные соединения. Также обратите внимание, как я создал соединение, используя указатели на функции вместо макросов SIGNAL и SLOT, этот синтаксис лучше, поскольку он проверяет во время компиляции, существуют ли функции, поэтому вы избегаете опечаток и тому подобного.

...