Используя moveToThread
, мы можем изменить сродство потока объекта. ОП спрашивает, как мы можем запустить две функции одного класса в разных потоках.
Пусть класс A
и две функции f1
и f2
class A
{
public:
void f1();
void f2(int i);
void run(); // shows how we can trigger f1 and f2 in different threads
}
Qt
уже предоставил класс для запуска функций в разных потоках, и он называется QtConcurrentRun
Функция QtConcurrent::run()
запускает функцию в отдельном потоке.
Возвращаемое значение функции доступно через QFuture
API.
Срабатывающая функция может быть либо внешней, либо функцией-членом. Так что в нашем случае, если бы мы хотели, чтобы из самого объекта запускались f1
и f2
в разных потоках, мы могли бы сделать следующее в 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);
}
аналогично, вы можете выполнять любую публичную функцию любого класса одновременно, например,
QImage image = ...;
QFuture<void> future = QtConcurrent::run(image, &QImage::invertPixels, QImage::InvertRgba);
A a;
QFuture<void> future1 = QtConcurrent::run(A, &A::f1);
Обратите внимание на разницу между двумя вызовами:
QtConcurrent::run()
также принимает указатели на функции-члены.
Первый аргумент должен быть либо константной ссылкой, либо указателем на
экземпляр класса. Передача по константной ссылке полезна, когда
вызов константных функций-членов; передача по указателю полезна для
вызов неконстантных функций-членов, которые изменяют экземпляр.
Чтобы проверить, когда одновременно выполненная функция завершена, вы должны использовать QFutureWatcher
.