以下是 QtConcurrent
的一些常见用法示例:
QtConcurrent::run
QtConcurrent::run
是最常用的函数,用于在单独的线程中运行一个函数。
运行普通函数
cpp
#include <QtConcurrent>
#include <QDebug>
#include <QThread>
void myFunction()
{
qDebug() << "Running in thread:" << QThread::currentThreadId();
}
int main()
{
QFuture<void> future = QtConcurrent::run(myFunction);
future.waitForFinished(); // 等待线程完成
return 0;
}
运行带参数的函数
cpp
#include <QtConcurrent>
#include <QDebug>
#include <QThread>
void myFunctionWithArgs(int arg1, const QString &arg2)
{
qDebug() << "Running in thread:" << QThread::currentThreadId();
qDebug() << "Arguments:" << arg1 << arg2;
}
int main()
{
int arg1 = 42;
QString arg2 = "Hello, world!";
QFuture<void> future = QtConcurrent::run(myFunctionWithArgs, arg1, arg2);
future.waitForFinished();
return 0;
}
运行成员函数
cpp
#include <QtConcurrent>
#include <QDebug>
#include <QThread>
class MyClass
{
public:
void myMemberFunction()
{
qDebug() << "Running in thread:" << QThread::currentThreadId();
}
};
int main()
{
MyClass obj;
QFuture<void> future = QtConcurrent::run(&obj, &MyClass::myMemberFunction);
future.waitForFinished();
return 0;
}
使用线程池
cpp
#include <QtConcurrent>
#include <QDebug>
#include <QThread>
#include <QThreadPool>
void myFunction()
{
qDebug() << "Running in thread:" << QThread::currentThreadId();
}
int main()
{
QThreadPool pool;
pool.setMaxThreadCount(4); // 设置线程池的最大线程数
QFuture<void> future = QtConcurrent::run(&pool, myFunction);
future.waitForFinished();
return 0;
}
QtConcurrent::map
QtConcurrent::map
函数用于对一个序列中的每个元素执行相同的函数。
非阻塞版本
cpp
#include <QtConcurrent>
#include <QDebug>
#include <QList>
void myFunction(int &value)
{
value *= 2; // 对每个元素进行操作
}
int main()
{
QList<int> list = {1, 2, 3, 4, 5};
QFuture<void> future = QtConcurrent::map(list, myFunction);
future.waitForFinished(); // 等待所有元素处理完成
for (int value : list)
{
qDebug() << value;
}
return 0;
}
阻塞版本
cpp
#include <QtConcurrent>
#include <QDebug>
#include <QList>
void myFunction(int &value)
{
value *= 2;
}
int main()
{
QList<int> list = {1, 2, 3, 4, 5};
QtConcurrent::blockingMap(list, myFunction);
for (int value : list)
{
qDebug() << value;
}
return 0;
}
QtConcurrent::mapped
QtConcurrent::mapped
函数与 QtConcurrent::map
类似,但它会返回一个新的序列,包含对每个元素执行函数后的结果。
非阻塞版本
cpp
#include <QtConcurrent>
#include <QDebug>
#include <QList>
int myFunction(int value)
{
return value * 2;
}
int main()
{
QList<int> list = {1, 2, 3, 4, 5};
QFuture<QList<int>> future = QtConcurrent::mapped(list, myFunction);
QList<int> result = future.result(); // 获取结果
for (int value : result)
{
qDebug() << value;
}
return 0;
}
阻塞版本
cpp
#include <QtConcurrent>
#include <QDebug>
#include <QList>
int myFunction(int value)
{
return value * 2;
}
int main()
{
QList<int> list = {1, 2, 3, 4, 5};
QList<int> result = QtConcurrent::blockingMapped(list, myFunction);
for (int value : result)
{
qDebug() << value;
}
return 0;
}
QtConcurrent::mappedReduced
QtConcurrent::mappedReduced
函数将 mapped
和 reduce
操作结合起来,先对序列中的每个元素执行函数,然后将结果合并为一个单一的结果。
cpp
#include <QtConcurrent>
#include <QDebug>
#include <QList>
int myFunction(int value)
{
return value * 2;
}
int reduceFunction(int sum, int value)
{
return sum + value;
}
int main()
{
QList<int> list = {1, 2, 3, 4, 5};
QFuture<int> future = QtConcurrent::mappedReduced(list, myFunction, reduceFunction);
int result = future.result(); // 获取最终结果
qDebug() << "Result:" << result;
return 0;
}
使用 QFutureWatcher
QFutureWatcher
可以用来监视 QFuture
的状态,并在任务完成时发出信号。
cpp
#include <QtConcurrent>
#include <QFutureWatcher>
#include <QDebug>
#include <QThread>
void myFunction()
{
qDebug() << "Running in thread:" << QThread::currentThreadId();
}
int main()
{
QFutureWatcher<void> watcher;
QObject::connect(&watcher, &QFutureWatcher<void>::finished, []()
{
qDebug() << "Task finished";
});
QFuture<void> future = QtConcurrent::run(myFunction);
watcher.setFuture(future);
// 主线程可以继续执行其他任务
qDebug() << "Main thread continues to run";
return 0;
}