kllo__ 2021-07-20 11:56 采纳率: 52.2%
浏览 66
已结题

Qthreadd run后台进行计算,前端更新进度条和界面子线程不能正确退出和重新启动

//线程处理函数
void MyThread::run()
{
    isPause=true;
    int i=0;
    int n=0;
    //    bool ret=true;
   qDebug()<<"isStop:"<<isStop;
    while(false==isStop)
    {
        qDebug()<<"循环开始1";
        mutex.lock();
         qDebug()<<"循环开始2";
        i++;
        qDebug()<<i;
        this->msleep(50);
        this->sum+=i;
        emit updateProgress(n,i);
        qDebug()<<"子线程号:"<<QThread::currentThread();
//        if(i==n && i>0)
//        {
//            i=0;
//        }
        mutex.unlock();
        qDebug()<<"退出循环1";
    }
   // mutex.lock();
    qDebug()<<"退出循环2";
}


//开始按钮
void Widget::on_btnStart_clicked()
{
    if(myT->isRunning()==true &&  myT->isStop==false)
    {
        return;
    }

    qDebug()<<"线程开始";
    ui->btnPause->setEnabled(true);
    ui->btnResume->setEnabled(true);
    ui->btnStop->setEnabled(true);
    myT->isStop=false;
    myT->start();

}

//停止按钮
void Widget::on_btnStop_clicked()
{
    if(myT->isRunning()==false && myT->isStop==true)
    {
        return;
    }

    //停止线程
    myT->pause();//暂停线程
    //ui->lineEdit->clear();
    qDebug() << "开始关闭线程";
    //myT->quit();//停止线程
   // myT->wait();//等待线程处理完手头工作
    myT->isStop=true;

}

第二次点开始的时候,我发现就执行到循环1那句,后面都没执行,然后退出每次都卡死零,没有关闭线程

  • 写回答

3条回答 默认 最新

  • 关注

    调试一下停止按钮,看变量状态值对不对,第二次打开应该是恢复resume,而不是启动。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 4月20日
  • 已采纳回答 4月12日
  • 创建了问题 7月20日

悬赏问题

  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料