C++ Qt与信号同步&;槽

C++ Qt与信号同步&;槽,c++,multithreading,qt,qtconcurrent,C++,Multithreading,Qt,Qtconcurrent,我是线程方面的新手,有人建议我使用qtconcurrent(qtc++) 我试图使用Qt Concurrent在线程中运行函数,我的函数运行良好,但从未发出信号/插槽 但是,如果我在不使用线程的情况下启动我的函数,请参考,一切正常 MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); QFuture

我是线程方面的新手,有人建议我使用qtconcurrent(qtc++)

我试图使用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::MainWindow(QWidget*父项):
QMainWindow(父级),
用户界面(新用户界面::主窗口)
{
用户界面->设置用户界面(此);
QFutureWatcher*watcher1=新的QFutureWatcher();
连接(watcher1,信号(finished()),此,插槽(getSizeFinished());
QString字符串=”http://ipv4.download.thinkbroadband.com/50MB.zip";
QFuture future1=QtConcurrent::run(this,&MainWindow::getRemoteFileSize,string);
观察者1->setFuture(未来1);
}
void主窗口::getSizeFinished()
{

qDebug()在这种情况下,您可能不需要创建连接,您可以在
m\u reply=m\u netmanager->get(req);
之后立即调用
main window::remoteHTTPHeader()

您可能希望检查回复是否有效完成,如下所示:

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

这样可以处理快速和慢速连接。还要注意我是如何使用函数指针而不是
信号
插槽
宏创建连接的,这种语法更好,因为它在编译时检查函数是否存在,这样可以避免输入错误等。

您可能不需要创建连接在这种情况下,您可以在
m\u reply=m\u netmanager->get(req);
之后立即调用
MainWindow::remoteHTTPHeader()

您可能希望检查回复是否有效完成,如下所示:

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

这样可以处理快速和慢速连接。还要注意,我是如何使用函数指针而不是
信号
插槽
宏创建连接的,这种语法更好,因为它在编译时检查函数是否存在,这样可以避免出现键入错误等情况。

未调用哪个信号?每个连接是否都是valid?这个:连接(m_reply,SIGNAL(metaDataChanged()),这个,SLOT(remoteHTTPHeader());-永远不会调用remoteHTTPHeader()使用
qDebug()验证连接是否正确创建是的它返回'true'哪个信号没有调用?每个连接都有效吗?这个:连接(m_reply,SIGNAL(metaDataChanged()),这个,SLOT(remoteHTTPHeader());-remoteHTTPHeader从不被调用使用
qDebug()验证是否正确创建了连接是的,它返回'true',谢谢你的帮助。如果我复制/粘贴你的代码,我总是选择'else'。我还发现'connect':mainwindow的语义错误。cpp:110:9:错误:没有匹配的成员函数来调用'connect'。哎呀,我留下了一个不应该在那里的参数,我已经修复了它。让我知道它现在是否有效。真的,很抱歉,我没有这样做注意…谢谢。但是我的函数remoteHTTPHeader()仍然从未执行过。它可能只会在非常快的连接上执行,如果它没有用处,您可以将其删除。在我的情况下,用户可以有快速和非常慢的连接,以获得您的帮助。如果我复制/粘贴您的代码,我总是在“else”情况下执行。我还收到“connect”的语义错误:mainwindow。cpp:110:9:错误:否匹配调用“connect”的成员函数哎呀,我留下了一个不应该存在的参数,我修复了它。让我知道它现在是否工作。确实,很抱歉我没有注意到它…谢谢。但是我的函数remoteHTTPHeader()仍然从未执行。它可能只会在非常快的连接上执行,如果它没有用,您可以将其删除。在我的情况下,用户可以有快速和非常慢的连接