2012-04-03 20 views
5

Creo un QFuture que quiero usar para paralelizar llamadas a una función de miembro. Más precisamente, tengo una clase con solveParallel .h:QtConcurrent con función de miembro

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

    void runCompute(solveModel * model_); 

    bool resultComput(); 

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

donde el méthode runCompute() está creando el miembro myFutureCompute. .cpp se parece a

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(); 
} 

Incluir (s) están correctos. Compilación falla, en la línea

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

con este error:

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 

Además, en la información del ratón para '& Director' en la misma línea de código se encuentra: Error: una referencia miembro que no debe ser relativa a un objeto específico.

¿Ves dónde está el truco? Gracias y saludos.

Respuesta

14

Desde el 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.

Te Possing un puntero a un puntero. También tenga en cuenta que no puede pasar los argumentos como lo hace, sino como argumentos adicionales en la función run. Lo siguiente debería funcionar:

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