c++ - Qt 与信号和插槽并发
问题描述
我是线程新手,有人建议我使用 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
这种语法更好,因为它在编译时检查函数是否存在,这样你就可以避免拼写错误等。
推荐阅读
- d3.js - d3 beeswarm chart - 修改为金字塔形堆叠
- javascript - 类型错误:_co.post 未定义
- google-apps-script - urlfetch 并不总是在 url 中加载查询
- gcc - 使用 arm-linux-gnueabihf 进行交叉编译
- oracle - 在块非常慢的 oracle 表单上搜索记录
- python - 如何使用 xpath 选择带有 attrs 的 div?
- ios - iOS Swift Multiline UILabel 与 UITableViewCell 内的 StackView
- ios - 为什么我收到错误“无法将类型(类)的值分配给类型 UICollectionViewDelegate、UICollectionViewDataSource?”
- entity-framework - 是否有针对 Visual Studio 2019 的 enable-migrations Command Not foundError 的解决方案?
- php - htaccess 404 和 400 重定向不适用于网站上的所有页面