Qt开发计时器暂停恢复功能时on_Pause_clicked内if语句不生效
问题原因
on_Pause_clicked()槽函数的判断逻辑存在顺序执行漏洞:
- 点击按钮触发函数时,若初始
isStart为true,会先进入第一个判断分支执行暂停操作,执行过程中会把isStart赋值为false - 第一个分支执行完毕后,代码不会跳出判断,会继续执行第二个独立的
if判断,此时isStart已经被修改为false,会直接命中第二个分支执行恢复计时逻辑,最终表现为点击暂停按钮后计时器完全没有暂停效果。
修复方法
将两个独立的if判断改为互斥的if...else结构,保证单次点击只会执行其中一个分支的逻辑,不会连续执行两段互斥操作。
修复后的on_Pause_clicked()函数代码如下:
void Widget::on_Pause_clicked() { if(isStart == true) { ptime->stop(); ui->Pause->setText("继续"); isStart=false; ui->Start->setEnabled(false); ui->Pause->setEnabled(true); ui->Clear->setEnabled(true); } else { ptime->start(1); ui->Pause->setText("暂停"); isStart=true; ui->Start->setEnabled(false); ui->Pause->setEnabled(true); ui->Clear->setEnabled(false); } }
可选优化点
- 当前代码给
QTimer设置的1ms超时间隔实际无法达到,Windows平台下Qt默认定时器精度约15ms,不需要极致毫秒精度的话可以将间隔调整为10ms,减少不必要的UI刷新开销 - 类成员中声明的
QLCDNumber *lcd指针全程未被使用,可以删除避免冗余 - 堆上创建的
ptime、timerecord对象没有在析构函数中释放,会造成内存泄漏,需要在析构函数中补充delete ptime; delete timerecord;逻辑
内容的提问来源于stack exchange,提问作者lxyzcm
相关产品推荐
相关产品推荐

