Qt多线程QtConcurrent类

来源:互联网 发布:淘宝客服每日工作内容 编辑:程序博客网 时间:2024/06/15 09:39

最近在学习Qt多线程,发现QtConcurrent代码简单粗暴,尝试着用。

发现并行计算的函数好像不能使类方法:

#include <QtWidgets>
#include <QtConcurrent>


using namespace QtConcurrent;


const int iterations = 20;


void spin(int &iteration)
{
    const int work = 1000 * 1000 * 40;
    volatile int v = 0;
    for (int j = 0; j < work; ++j)
        ++v;


    qDebug() << "iteration" << iteration << "in thread" << QThread::currentThreadId();
}


int main(int argc, char **argv)
{
    QApplication app(argc, argv);


    // Prepare the vector.
    QVector<int> vector;
    for (int i = 0; i < iterations; ++i)
        vector.append(i);


    // Create a progress dialog.
    QProgressDialog dialog;
    dialog.setLabelText(QString("Progressing using %1 thread(s)...").arg(QThread::idealThreadCount()));


    // Create a QFutureWatcher and connect signals and slots.
    QFutureWatcher<void> futureWatcher;
    QObject::connect(&futureWatcher, SIGNAL(finished()), &dialog, SLOT(reset()));
    QObject::connect(&dialog, SIGNAL(canceled()), &futureWatcher, SLOT(cancel()));
    QObject::connect(&futureWatcher, SIGNAL(progressRangeChanged(int,int)), &dialog, SLOT(setRange(int,int)));
    QObject::connect(&futureWatcher, SIGNAL(progressValueChanged(int)), &dialog, SLOT(setValue(int)));


    // Start the computation.
    futureWatcher.setFuture(QtConcurrent::map(vector, spin));


    // Display the dialog and start the event loop.
    dialog.exec();


    futureWatcher.waitForFinished();


    // Query the future to check if was canceled.
    qDebug() << "Canceled?" << futureWatcher.future().isCanceled();
}

如上面程序的 futureWatcher.setFuture(QtConcurrent::map(vector, spin));这一句,

spin后面是不带参数的,当它不是类的方法时,上面这句调试能够通过,但当其位类的方法时,调试提示说缺少参数,

难道是类方法就不行?!


明晚接着研究



0 0
原创粉丝点击