qt如何在线程中创建一个新线程
时间: 2023-12-14 10:38:20 浏览: 31
在 Qt 中,可以使用 `QThread` 类来创建一个新的线程。以下是一个简单的示例代码,展示如何在线程中创建一个新线程:
```
class MyWorker : public QObject
{
Q_OBJECT
public:
explicit MyWorker(QObject *parent = nullptr);
public slots:
void doWork();
signals:
void workFinished();
};
MyWorker::MyWorker(QObject *parent) : QObject(parent)
{
}
void MyWorker::doWork()
{
// 在这里执行耗时操作
// ...
emit workFinished();
}
class MyThread : public QThread
{
Q_OBJECT
public:
explicit MyThread(QObject *parent = nullptr);
protected:
void run() override;
private:
MyWorker *m_worker;
};
MyThread::MyThread(QObject *parent)
: QThread(parent), m_worker(new MyWorker)
{
}
void MyThread::run()
{
connect(m_worker, &MyWorker::workFinished, this, &MyThread::quit);
// 将 MyWorker 移动到新线程中
m_worker->moveToThread(this);
// 开始执行 doWork() 函数
QMetaObject::invokeMethod(m_worker, "doWork");
// 进入事件循环,直到 doWork() 函数执行完毕
exec();
// 清理资源
delete m_worker;
m_worker = nullptr;
}
```
在上面的代码中,`MyWorker` 类表示要在新线程中执行的工作,它继承自 `QObject` 类,拥有一个 `doWork()` 槽,用于执行耗时操作。`MyThread` 类继承自 `QThread` 类,它拥有一个私有成员变量 `m_worker`,用于执行工作。在 `run()` 函数中,我们将 `m_worker` 移动到新线程中,并通过 `QMetaObject::invokeMethod()` 函数调用 `doWork()` 槽,然后进入事件循环,直到 `doWork()` 函数执行完毕。最后,我们清理资源并退出线程。
要创建一个新线程并执行工作,可以使用以下代码:
```
// 创建新线程
MyThread *thread = new MyThread;
// 启动线程
thread->start();
// 等待线程结束
thread->wait();
```
这里我们创建了一个新的 `MyThread` 对象并调用了 `start()` 函数来启动线程。然后,我们调用 `wait()` 函数来等待线程结束。注意,这里我们使用了阻塞方式等待线程结束,也可以使用信号槽机制来等待线程结束。