QT多线程与线程池
https://www.cnblogs.com/wanghongyang/p/14902679.html
https://www.cnblogs.com/lcgbk/p/13967448.html#34-qtconcurrentrunqthreadpool
面试题: https://juejin.cn/post/7338269539539648539
Qt 提供了多种多线程编程方式,以适应不同的应用场景和需求。从低级线程管理到高级的并行处理,Qt 的多线程机制涵盖了各种用例。以下是 Qt 中常用的多线程方式及其应用场景:
1. QThread
QThread 是 Qt 中最基础的线程类,用于创建和管理独立的线程。QThread 允许你在独立的线程中运行代码,这适用于需要创建独立线程的任务。
使用方式
继承 QThread:创建一个子类继承 QThread,并重载 run() 方法。在 run() 中实现线程任务。
使用信号与槽:通过信号与槽机制实现线程之间的通信。
启动和停止:通过 start() 启动线程,使用 quit() 或 terminate() 停止线程。
示例
#include <QThread>
#include <QDebug>
class WorkerThread : public QThread {
public:
void run() override {
qDebug() << "Thread started";
QThread::sleep(2);
qDebug() << "Thread finished";
}
};
int main() {
WorkerThread thread;
thread.start();
thread.wait(); // 等待线程完成
return 0;
}
2. QRunnable 和 QThreadPool
QRunnable 用于定义可运行的任务,而 QThreadPool 用于管理线程池。这种方式适用于需要高性能并行处理的场景,避免频繁创建和销毁线程。
使用方式
继承 QRunnable:创建一个子类继承 QRunnable,并实现 run() 方法。
将任务添加到线程池:使用 QThreadPool::globalInstance() 获取全局线程池,然后通过 start() 添加任务。
示例
#include <QRunnable>
#include <QThreadPool>
#include <QDebug>
class Worker : public QRunnable {
public:
void run() override {
qDebug() << "Runnable executed";
}
};
int main() {
Worker *worker = new Worker();
QThreadPool::globalInstance()->start(worker);
return 0;
}
3. QtConcurrent
QtConcurrent 提供了一组高级工具,用于异步和并行处理。适用于数据并行、异步操作、任务队列等场景。
使用方式
异步任务:使用 QtConcurrent::run() 在后台线程中运行任务。
并行数据处理:使用 QtConcurrent::map()、QtConcurrent::filter() 等实现数据并行处理。
任务跟踪:使用 QFuture 和 QFutureWatcher 跟踪任务状态。
示例
#include <QtConcurrent>
#include <QFuture>
#include <QDebug>
int longTask() {
QThread::sleep(3);
return 42;
}
int main() {
QFuture<int> future = QtConcurrent::run(longTask);
qDebug() << "Main thread continues while task runs in background";
future.waitForFinished(); // 等待任务完成
qDebug() << "Task result:" << future.result();
return 0;
}
4. 使用QObject写一个类 并move到新的thread对象
如何选择适当的多线程方式
独立线程:如果需要独立的线程来处理任务,使用 QThread。适用于复杂的后台任务、长时间运行的任务等。
线程池:如果需要高性能并行处理,使用 QRunnable 和 QThreadPool。适用于需要重用线程的场景,避免频繁创建和销毁线程。
异步和并行处理:如果需要高级的异步和并行处理,使用 QtConcurrent。适用于异步任务、数据并行等。
对象业务逻辑复杂使用4去创建对象
注意事项
线程安全:确保共享数据的访问是线程安全的,避免数据竞争和死锁。
信号与槽:在多线程环境中,信号与槽机制可以用于线程之间的通信。
资源管理:确保线程和任务正确管理生命周期,避免资源泄漏。
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 1430797759@qq.com