c++ - Qt 并发与信号和槽

标签 c++ multithreading qt qtconcurrent

我是线程方面的新手,有人建议我使用 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;
}

最佳答案

在这种情况下您可能不需要创建连接,您可以调用 MainWindow::remoteHTTPHeader()m_reply = m_netmanager->get(req);之后.

您可能想像这样检查回复是否有效完成:

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

您可以通过这种方式处理快速和慢速连接。还要注意我是如何使用函数指针而不是 SIGNAL 创建连接的和 SLOT宏,这种语法更好,因为它会在编译时检查函数是否存在,这样您就可以避免拼写错误等。

关于c++ - Qt 并发与信号和槽,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56966842/

相关文章:

c++ - 有人可以解释一下,为什么我的代码不起作用?

c# - 让用户选择他想要多少个线程?

javascript - NodeJS : Get Current VM Context

c++ - 为什么必须在开始时包含 stdafx.h?

c++ - 是否可以限制模板?

c++ - 什么是 LPSTREAM 对象以及如何使用它?

java - 运行线程时,旋转变换无法在重新绘制中正常工作

qt - 客户端套接字发送但静默服务器套接字不接收

c++ - 如何使用 QDirIterator 扫描多个目录

c++ - 避免堆分配的宏?在这种情况下有那么糟糕吗?