关于ui界面中自建线程如何关闭的问题

软件: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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值