这里我详细讲解一下“QT实现多线程两种方式案例详解”的攻略。
一、关于多线程
多线程指从计算机的角度上,单个程序可以同时执行多个线程,在每个线程里执行不同的任务。在实际应用中,多线程可以有效提高程序的性能,增强用户体验。
在QT中,多线程实现可以带来许多好处,比如应用程序更稳定、更快速,用户交互更流畅等等。
二、多线程实现方式
QT中实现多线程的方式主要有两种:一种是使用QThread类,另一种是使用Qt Concurrent库。
1.使用QThread类
QThread类是QT中实现多线程的重要类之一,是一种基于事件循环机制的多线程实现方式,通过重载“run()”方法,在多线程中执行我们想要执行的代码。
以下是QThread类的使用示例:
class MyThread : public QThread
{
Q_OBJECT
public:
void run() override
{
//此处放置您想要在线程中执行的代码
}
}
//线程启动与结束的例子
MyThread workerThread;
workerThread.start(); //启动线程
workerThread.wait(); //等待线程结束
2.使用Qt Concurrent库
Qt Concurrent库是QT提供的另一种多线程实现方式,它提供丰富的函数和模块,能够在不同的线程中执行不同的任务。
以下是Qt Concurrent库的使用示例:
#include <QtConcurrent/QtConcurrent>
//计算函数
int calculate(int value)
{
//此处放置您想要在线程中执行的代码
}
//线程启动与结束的例子
QFuture<int> future = QtConcurrent::run(calculate, 42); //启动线程
future.waitForFinished(); //等待线程结束
int result = future.result(); //获取返回值
三、实现案例
下面通过两个实例分别展示QThread类和Qt Concurrent库的多线程实现方式。
1.QThread实现多线程
class MyWorker : public QObject
{
Q_OBJECT
public:
MyWorker(QObject* parent = nullptr)
: QObject(parent)
{
}
public slots:
void run()
{
//时间较长的任务(休眠)
QThread::sleep(2);
//发送信号
emit finished();
}
signals:
void finished();
};
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget* parent = nullptr) : QMainWindow(parent)
{
//初始化UI
setCentralWidget(&m_centralWidget);
m_centralWidget.setLayout(&m_layout);
m_layout.addWidget(&m_button);
//绑定槽函数
QObject::connect(&m_button, &QPushButton::clicked, this, &MainWindow::onButtonClicked);
QObject::connect(&m_worker, &MyWorker::finished, this, &MainWindow::onWorkerFinished);
}
public slots:
void onButtonClicked()
{
//禁用按钮
m_button.setDisabled(true);
//启动线程
m_workerThread.start();
}
void onWorkerFinished()
{
//启用按钮
m_button.setDisabled(false);
//结束线程
m_workerThread.quit();
m_workerThread.wait();
}
private:
//UI元素
QWidget m_centralWidget;
QHBoxLayout m_layout;
QPushButton m_button{"Start"};
//线程及相关元素
QThread m_workerThread;
MyWorker m_worker{};
};
在这个例子中,我们首先创建了一个MyWorker类,它在run()方法中执行了一个较长时间的任务(休眠2秒),然后通过信号finished通知线程执行完毕。我们构建一个UI,然后通过连接UI槽函数onButtonClicked(),我们启动了线程,并禁用UI上的按钮,以便在线程运行期间防止用户再次启动线程。在线程完成后,我们通过槽函数onWorkerFinished()启用按钮,并结束线程。
2.Qt Concurrent库实现多线程
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget* parent = nullptr) : QMainWindow(parent)
{
//初始化UI
setCentralWidget(&m_centralWidget);
m_centralWidget.setLayout(&m_layout);
m_layout.addWidget(&m_button);
//绑定槽函数
QObject::connect(&m_button, &QPushButton::clicked, this, &MainWindow::onButtonClicked);
}
public slots:
void onButtonClicked()
{
//禁用按钮
m_button.setDisabled(true);
//启动线程
QFuture<void> future = QtConcurrent::run(this, &MainWindow::longRunningTask);
QFutureWatcher<void>* watcher = new QFutureWatcher<void>();
QObject::connect(watcher, &QFutureWatcher<void>::finished, this, &MainWindow::onFinished);
watcher->setFuture(future);
}
void longRunningTask()
{
//时间较长的任务(休眠)
QThread::sleep(2);
}
void onFinished()
{
//启用按钮
m_button.setDisabled(false);
}
private:
//UI元素
QWidget m_centralWidget;
QHBoxLayout m_layout;
QPushButton m_button{"Start"};
};
在这个例子中,我们通过按钮点击事件onButtonClicked()启动了线程,然后在longRunningTask()方法中执行了一个较长时间的任务(休眠2秒)。在线程完成后,我们启用了按钮,以便用户可以再次启动线程。
对于Qt Concurrent库,我们通过调用QtConcurrent::run()方法启动了任务,然后使用QFutureWatcher类监视任务的完成情况,在线程完成后,我们调用槽函数onFinished()启用UI上的按钮。
结论
通过以上的两个案例,我们分别演示了使用QThread类和Qt Concurrent库实现多线程的方式,并介绍了实现过程。在实际开发中,选择哪种方式取决于实际需求和开发习惯。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:QT实现多线程两种方式案例详解 - Python技术站