qt多线程示例
时间: 2023-06-28 08:07:52 浏览: 100
下面是一个简单的 Qt 多线程示例,它展示了如何在 Qt 中使用多线程来执行耗时的任务,而不会阻塞主线程。
```cpp
#include <QtCore/QCoreApplication>
#include <QtCore/QThread>
#include <QtCore/QDebug>
class Worker : public QObject
{
Q_OBJECT
public:
explicit Worker(QObject *parent = nullptr) : QObject(parent) {}
public slots:
void doWork()
{
qDebug() << "Worker thread id: " << QThread::currentThreadId();
// 模拟耗时任务
for (int i = 0; i < 1000000000; ++i) {}
emit workFinished();
}
signals:
void workFinished();
};
int main(int argc, char *argv[])
{
QCoreApplication app(argc, argv);
qDebug() << "Main thread id: " << QThread::currentThreadId();
// 创建工作线程
QThread *thread = new QThread;
Worker *worker = new Worker;
// 将 Worker 对象移动到工作线程中
worker->moveToThread(thread);
// 连接 Worker 的 workFinished() 信号到工作线程的 quit() 槽
QObject::connect(worker, &Worker::workFinished, thread, &QThread::quit);
// 连接工作线程的 started() 信号到 Worker 的 doWork() 槽
QObject::connect(thread, &QThread::started, worker, &Worker::doWork);
// 启动工作线程
thread->start();
// 进入事件循环,等待工作线程完成任务
app.exec();
// 清理资源
delete worker;
delete thread;
return 0;
}
#include "main.moc"
```
在上面的示例中,我们创建了一个 `Worker` 类来执行耗时任务。我们将 `Worker` 对象移动到一个新的线程中,并且当工作完成时,发射一个 `workFinished()` 信号。我们还创建了一个 `QThread` 对象来处理工作线程,将 `Worker::doWork()` 槽连接到工作线程的 `started()` 信号上,以便在工作线程启动时执行。
在 `main()` 函数中,我们创建了一个 `QCoreApplication` 对象,并打印了主线程的 ID。然后,我们启动了工作线程,并进入事件循环,等待工作线程完成工作。最后,我们清理了资源并退出程序。
阅读全文