软件:qt
问题描述:
为了实现点击下一步按钮,进入下一个ui界面,当前界面的线程如果没有结束会导致下一个界面新建的线程与其起冲突,所以需要在进入下一界面前将当前线程结束。
方案1:(用信号与槽关闭线程):
BloodPressureWidget::BloodPressureWidget(QWidget *parent) : QWidget(parent) {
ui.setupUi(this);
this->setWindowFlags(Qt::FramelessWindowHint);//隐藏外框
qRegisterMetaType<BloodPressureRes>("BloodPressureRes");
connect(ui.pushButton_start, &QPushButton::clicked, this,
&BloodPressureWidget::Btn_OnStartClicked);
connect(ui.pushButton_stop, &QPushButton::clicked, this,
&BloodPressureWidget::Btn_OnStopClicked);
connect(ui.pushButton_next, &QPushButton::clicked, this,
&BloodPressureWidget::Btn_OnNextClicked);
//线程创建位置
thread = new MyThread(this);
}
BloodPressureWidget::~BloodPressureWidget()
{
}
void BloodPressureWidget::Btn_OnStartClicked() {
//自定义的线程启动
connect(thread, &MyThread::isDone, this, &BloodPressureWidget::dealDone);
thread->start();
//当按下一步时,关闭线程
connect(this,&BloodPressureWidget::Btn_OnNextClicked, this,&BloodPressureWidget::stopThread);
}
void BloodPressureWidget::stopThread()
{
//停止线程
thread->quit();
//等待线程处理完手头工作,运行
thread->wait();
}
方案2:(直接在“下一步”按钮的执行函数中写)
BloodPressureWidget::BloodPressureWidget(QWidget *parent) : QWidget(parent) {
ui.setupUi(this);
this->setWindowFlags(Qt::FramelessWindowHint);//隐藏外框
qRegisterMetaType<BloodPressureRes>("BloodPressureRes");
connect(ui.pushButton_start, &QPushButton::clicked, this,
&BloodPressureWidget::Btn_OnStartClicked);
connect(ui.pushButton_stop, &QPushButton::clicked, this,
&BloodPressureWidget::Btn_OnStopClicked);
connect(ui.pushButton_next, &QPushButton::clicked, this,
&BloodPressureWidget::Btn_OnNextClicked);
//线程创建位置
thread = new MyThread(this);
}
BloodPressureWidget::~BloodPressureWidget()
{
}
void BloodPressureWidget::Btn_OnStartClicked() {
//自定义的线程启动
connect(thread, &MyThread::isDone, this, &BloodPressureWidget::dealDone);
thread->start();
}
void BloodPressureWidget::Btn_OnNextClicked() {
//停止线程
thread->quit();
//等待线程处理完手头工作,运行
thread->wait();
}
错误的结果是:点击下一步,界面卡死了
另外的注意点:
1.新建线程一定要放到界面的初始化函数中,而不要放到按键的执行函数中,否则同样会导致不停新建线程,冲突,数据丢失(实践证实过了,我也吃过亏,自己是在读取串口数据的过程中西区的经验)
2.通过断点调试发现,上述正确和错误的办法均用到了quit和wait,其实并不能让线程退出,第一种办法其实也是错的,因为哪有将槽与槽链接的啊!方案1=方案2。事实上QT中让线程停止均应该用标志位的办法,更靠谱,即定义一个全局变量tip,想让他强制退出,那就让tip=0,在线程的执行函数中不断进行判断tip是否置0,如果置零则break,强制返回一个值,结束。
本文提到的的问题是通过看黑马程序员这一章节的内容解决的的,当然也有我自己的实践经验。05_线程1_2_哔哩哔哩_bilibili