Qt创建子线程,并用按键控制线程开启
时间: 2024-11-30 12:28:43 浏览: 0
在Qt中,创建子线程通常使用`QThread`类来实现。首先,你需要创建一个派生自`QObject`并包含`QThread`的类,比如自定义一个名为`MyWorkerThread`的类。然后,在主线程中,你可以这样做:
1. **定义子线程类**:
```cpp
class MyWorkerThread : public QObject, public QThread
{
public:
explicit MyWorkerThread(QObject *parent = nullptr)
: QObject(parent), QThread(parent) {}
void run() override {
// 这里是你想要在线程中运行的代码
while (!quitFlag.isSet()) {
// 模拟一些工作
qDebug() << "Working...";
QThread::sleep(1000); // 每秒休眠1秒
}
}
~MyWorkerThread() {
quit();
wait(); // 等待线程结束
}
signals:
void threadFinished();
private:
bool quitFlag;
};
```
2. **启动子线程**:
```cpp
// 在主窗口或其他适当的地方
MyWorkerThread* workerThread = new MyWorkerThread(this);
connect(workerThread, &MyWorkerThread::threadFinished, this, []() { qDebug() << "Worker thread finished"; });
workerThread->start();
// 使用按键控制线程开启和关闭
QPushButton* startButton = new QPushButton("Start Thread");
connect(startButton, &QPushButton::clicked, [workerThread]() {
if (!workerThread->isRunning()) {
workerThread->quit(); // 关闭当前线程
workerThread->start(); // 开启线程
} else {
workerThread->quit(); // 已经运行,则停止
}
});
```
在这个例子中,按下"Start Thread"按钮会启动线程。如果线程正在运行,再次点击则会停止线程。当线程完成所有任务后,它会发出`threadFinished`信号,你可以在主线程捕获这个信号并做出相应处理。
阅读全文