2010-01-28 12 views
16

Parece que no puedo asociar QtConcurrent::run() con un método (miembro de la función de una clase) solo con una función simple. ¿Cómo puedo hacer esto?es posible utilizar QtConcurrent :: run() con un miembro de función de una clase

Con una función normal no puedo emitir señales y es un arrastre. ¿Por qué alguien encontraría que esta es una mejor alternativa al QThread me supera y me gustaría obtener alguna información?

+0

Tenga en cuenta que si bien es posible emitir una señal en un hilo, utilizando cualquiera de los métodos, no puede crear widgets. Solo el hilo principal de la GUI puede. Además, es probable que el hilo de la GUI principal deba procesar la señal. – CodeLurker

Respuesta

19

Sí, esto es posible (y bastante fácil).

Aquí es un ejemplo (de la documentación de Qt):

// call 'QStringList QString::split(const QString &sep, SplitBehavior behavior, Qt::CaseSensitivity cs) const' in a separate thread 
QString string = ...; 
QFuture<QStringList> future = QtConcurrent::run(string, &QString::split, QString(", "), QString::KeepEmptyParts, Qt::CaseSensitive); 
... 
QStringList result = future.result(); 

Básicamente, todo lo que tiene que hacer es pasar un puntero al objeto como primer argumento y la dirección del método como el segundo argumento (seguido de otros argumentos).

Ver: https://doc.qt.io/qt-5/qtconcurrentrun.html

+1

One Lo que me costó un poco de tiempo es que a QtConcurrent no le gustan las funciones sobrecargadas: D – hakermania

+0

'pass a pointer' - tenga en cuenta que' string' en su ejemplo no es (pero debería ser, supongo);) – mlvljr

5

El problema es que cuando utiliza un puntero a la función miembro, necesita proporcionar de alguna manera el parámetro this también (es decir, el objeto sobre el que se debe llamar a la función miembro).

La sintaxis para esto es bastante difícil si no lo ha usado antes. Puede ser bueno leer http://www.parashift.com/c++-faq-lite/pointers-to-members.html.

Supongamos que tiene una clase Dog y una función Dog::walkTheDog(int howlong_minutes). A continuación, debería ser capaz de utilizar std::bind1st y std::mem_fun para que sea adecuado para QtConcurrent::run:

Dog dog; 
// Walk this dog for 30 minutes 
QtConcurrent::run(std::bind1st(std::mem_fun(&Dog::walkTheDog), &dog), 30); 

std::bind1st(std::mem_fun(&Dog::walkTheDog), &dog) devuelve un objeto de tipo función que se ha unido a la función miembro de un perro en particular. A partir de ese punto, puede usarlo de forma similar a como lo haría con una función independiente.

+0

puede por favor mirar esta pregunta, me he enfrentado a tal problema, https: //stackoverflow.com/questions/47792153/invalid-use-of-non-static-member-function-qtconcurrent? Noredirect = 1 # comment82546866_47792153 –

Cuestiones relacionadas