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