c++ qt qtconcurrent

c++ - ¿Es posible usar QtConcurrent:: run() con una función miembro de una clase?



(2)

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

Con una función regular no puedo emitir señales y es un arrastre. ¿Por qué alguien encontraría que esta alternativa mejor a QThread está fuera de mi QThread y me gustaría QThread alguna información?


El problema es que cuando usa un puntero para la función miembro, también debe proporcionar this parámetro (es decir, el objeto en el que se debe llamar la función miembro).

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

Digamos que tienes una clase Dog y una función Dog::walkTheDog(int howlong_minutes) . Entonces deberías poder usar 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 similar a una función que ha vinculado la función miembro a un perro en particular. Desde ese punto, puede usarlo de la misma manera que podría usar una función independiente.


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

Aquí hay 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 segundo argumento (seguido de cualquier otro argumento).

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