2012-04-03 2 views
5

Я создаю QFuture, который я хочу использовать для параллелизации вызовов функции-члена. Точнее, у меня есть класс solveParallel с .h:QtConcurrent с функцией-членом

class solverParallel { 
public: 
    solverParallelData(Manager* mgr_); 
    virtual ~solverParallel(void); 

    void runCompute(solveModel * model_); 

    bool resultComput(); 

private: 
    Manager *myMgr; 
    QFuture<bool> myFutureCompute; 
}; 

где Methode runCompute() создает элемент myFutureCompute. .cpp выглядит как

solveParallel::solveParallel(Manager* mgr_) 
:m_mgr(mgr_) 
{ 
} 

solverParallel::~solverParallel(void){} 

void solverParallel::runCompute(solveModel* model) 
{ 
    futureComput = QtConcurrent::run(&this->myMgr,&Manager::compute(model)); 
} 

bool solverParallelData::resultComput() 
{ 
    return m_futureComput.result(); 
} 

Включает (и) все в порядке. Компиляция не удается, по линии

futureComput = QtConcurrent::run(&this->myMgr,&Manager::compute(model)); 

с этой ошибкой:

Error 44 error C2784: 'QFuture<T> QtConcurrent::run(T (__cdecl *)(Param1),const  Arg1 &)' : could not deduce template argument for 'T (__cdecl *) (Param1)' from 'Manager **' solverparallel.cpp 31 

Кроме того, по информации мышиной «& Manager», в одной строке кода означает: Ошибка: нестатический контрольный элемент должен быть относительным к определенному объекту.

Вы видите, где трюк? Спасибо и приветствую.

ответ

14

От official documentation:

QtConcurrent::run() also accepts pointers to member functions. The first argument must be either a const reference or a pointer to an instance of the class. Passing by const reference is useful when calling const member functions; passing by pointer is useful for calling non-const member functions that modify the instance.

Вы possing указатель на указатель. Также обратите внимание, что вы не можете передавать аргументы так, как вы это делаете, а как дополнительные аргументы в функции run. Должно работать следующее:

futureComput = QtConcurrent::run(this->myMgr,&Manager::compute, model);