Usando moveToThread
podemos cambiar la afinidad del hilo de un objeto. Lo que OP pregunta es cómo podemos ejecutar dos funciones de la misma clase en diferentes hilos.
clase
A
y dos funciones
Let f1
y f2
class A
{
public:
void f1();
void f2(int i);
void run(); // shows how we can trigger f1 and f2 in different threads
}
Qt
ya proporcionan una clase para ejecutar funciones en diferentes temas y se llama QtConcurrentRun
La función QtConcurrent::run()
ejecuta una función en una hilo separado El valor de retorno de la función está disponible a través de la API QFuture
.
La función que se activa puede ser una función externa o una función de miembro. Por lo que en nuestro caso si queríamos desde el objeto en sí mismo para comenzar f1
y f2
en diferentes hilos que podíamos hacer lo siguiente en run()
void run()
{
// QFuture<void> because f1 is void
QFuture<void> future1 = QtConcurrent::run(this, &A::f1);
int k = 5; // Concurrent run with arguments
QFuture<void> future2 = QtConcurrent::run(this, &A::f2, k);
}
Del mismo modo se podría ejecutar cualquier función pública de cualquier clase al mismo tiempo, por ejemplo
QImage image = ...;
QFuture<void> future = QtConcurrent::run(image, &QImage::invertPixels, QImage::InvertRgba);
A a;
QFuture<void> future1 = QtConcurrent::run(A, &A::f1);
cuenta de la diferencia entre las dos llamadas:
QtConcurrent::run()
también acepta punteros a functi miembro ons. El primer argumento debe ser una referencia constante o un puntero a una instancia de la clase . La referencia Passing by const es útil cuando llama a las funciones miembro de const; pasar por puntero es útil para llamando a funciones miembro no constantes que modifican la instancia.
Con el fin de comprobar cuándo ha finalizado una función ejecutada simultáneamente debe utilizar un QFutureWatcher
.
relacionado: [Aplicación principal QThread blocking] (http://stackoverflow.com/questions/3213738/) –