如何通过QtConcurrent调用带参数的函数

时间:2014-05-16 19:10:48

标签: c++ multithreading qt

在我的应用程序中有一个阻止我的UI的保存过程。优化是不够的,所以我想用QtConcurrent实现线程,但我不能让它工作,虽然语法看起来很容易。

现在的样子(原则):

Traymenu::Traymenu(QApplication *a){
    //...

    void save(){
        //Get the savepath, choose if saving is necessary, and trigger saving
        QString path = getSavePath();
        saveNotes(path);
    }

    void saveNotes(QString savePath){
        //save to the given path, takes quite a while, should be parallel
    }    
}

我尝试过:

Traymenu::Traymenu(QApplication *a){
    //...

    void save(){
        //Get the savepath, choose if saving is necessary, and trigger saving
        QString path = getSavePath();
        QFuture<void> result = QtConcurrent(saveNotes, path); //ERROR
    }

    void saveNotes(QString savePath){
        //save to the given path
    }    
}

此外,在我的标题中,我包含了这个:

#include <QtConcurrent/QtConcurrentRun>

错误消息是

C:\App\appname\traymenu.cpp:584: Error: no matching function for call 
to 'run(<unresolved overloaded function type>, QString&)'
             QFuture<void> future = QtConcurrent::run(save, outputFilename);
                                                                          ^

我也试过这个:

QFuture<void> future = QtConcurrent::run(this, this->save(outputFilename));

错误是

C:\App\appname\traymenu.cpp:584: Error: invalid use of void expression
                 QFuture<void> future = QtConcurrent::run(this, this->save(outputFilename));
                                                                                      ^

我的标题如下:

class Traymenu : public QSystemTrayIcon
{
    Q_OBJECT
public:
    Traymenu(QApplication *);
    ~Traymenu();

    void save();        
    void saveNotes(QString);     
    //[...]     

我做错了什么?

1 个答案:

答案 0 :(得分:4)

来自official documentation

  

使用会员功能

     

QtConcurrent :: run()也接受指向成员函数的指针。第一个参数必须是const引用或指向该类实例的指针。在调用const成员函数时,通过const引用传递是很有用的。传递指针对于调用修改实例的非const成员函数很有用。

这意味着你会写这个来实现这个目的:

QtConcurrent::run(this, &Traymenu::saveNotes, outputFileName);