2012-04-03 16 views
5

Creo un QFuture che desidero utilizzare per parallelizzare le chiamate a una funzione membro. Più precisamente, ho una classe con solveParallel .h:QtConcorrente con funzione membro

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

    void runCompute(solveModel * model_); 

    bool resultComput(); 

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

dove la methode runCompute() sta creando il membro myFutureCompute. .cpp è uguale 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(); 
} 

Includi (s) okay. Compilazione fallisce, on line

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

con questo errore:

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 

Inoltre, sulla informazioni del mouse per '& Manager' in stessa riga di codice si trova: Errore: un riferimento membro non statico deve essere relativo a un oggetto specifico.

Vedete dov'è il trucco? Grazie e saluti.

risposta

14

Dal 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.

Si sono possing un puntatore a un puntatore. Si noti inoltre che non è possibile passare gli argomenti come si fa, ma come argomenti aggiuntivi nella funzione run. Il seguente dovrebbe funzionare:

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