QT C++创建线程
时间: 2024-12-26 15:25:12 浏览: 7
### 如何在 QT 框架下用 C++ 创建和管理线程
#### 使用 `std::thread` 和 Qt 的信号槽机制
当使用标准库中的 `std::thread` 来创建新线程时,可以利用Qt的信号槽机制来处理跨线程通信。下面是一个简单的例子,在按钮点击事件中启动一个新的线程并让其脱离主线程独立运行。
```cpp
void Widget::on_pushButton_clicked()
{
std::thread my_thread(&Widget::showInfo, this);
my_thread.detach();
}
```
这里展示了如何通过调用成员函数 `showInfo()` 启动新的工作线程,并立即调用了 `detach()` 方法使该线程不再被自动回收[^2]。
然而需要注意的是,这种方式虽然简单但是并不推荐用于复杂的GUI应用程序开发当中,因为它缺乏对资源的有效管理和错误恢复能力。
#### 利用 QThread 类进行更安全的操作
对于更加复杂的应用场景来说,建议采用Qt自带的 `QThread` 类来进行多线程编程。这不仅能够更好地控制线程生命周期,还可以方便地与其他Qt组件集成在一起。
一种常见做法是继承自 `QThread` 并重写它的 `run()` 函数:
```cpp
class Worker : public QObject {
Q_OBJECT
public slots:
void process() {
while (true) {
qDebug()<<i;
emit valueChanged(QString::number(++i));
sleep(1);
}
}
signals:
void valueChanged(const QString &);
private:
int i=0;
};
// ...
Worker worker;
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent), thread(new QThread(this))
{
connect(thread,SIGNAL(started()),&worker,SLOT(process()));
connect(&worker,SIGNAL(valueChanged(QString)),this,SLOT(updateLCD(QString)));
worker.moveToThread(thread);
}
void MainWindow::startWork(){
thread->start();
}
```
上述代码片段定义了一个名为 `Worker` 的类作为实际工作的载体,并将其移动到由 `QThread` 对象表示的新线程里去执行具体的任务逻辑。与此同时还建立了必要的连接以便于实时更新UI界面元素上的显示内容[^1]。
另外值得注意的一点是在关闭程序之前应该确保所有后台线程都已经正常结束以免造成意外情况发生。
阅读全文