找回密码
 立即注册
收起左侧

关于QT并发控制两个进度条的问题

5
回复
8524
查看
[复制链接]
累计签到:14 天
连续签到:1 天
来源: 2014-11-21 13:50:48 显示全部楼层 |阅读模式
1Qter豆
在我的程序中,我想同时运行两个进度条任务,现在问题是

当我已运行一个进度任务时 再次运行另一个进度条任务, 前一个进度条会阻塞 直到另一个进度任务完成在执行前一个

我想问问如何并发控制让两个任务同时工作呢

请大家说说想法 给我一点启发

最佳答案

查看完整内容

用多线程来做,不然进入循环之中其他会阻塞的。
回复

使用道具 举报

累计签到:1569 天
连续签到:1 天
2014-11-21 13:50:49 显示全部楼层
用多线程来做,不然进入循环之中其他会阻塞的。
回复

使用道具 举报

累计签到:14 天
连续签到:1 天
2014-11-22 12:16:39 显示全部楼层
yafeilinux 发表于 2014-11-21 22:17
用多线程来做,不然进入循环之中其他会阻塞的。

问题是线程里面能够用那个gui类吗  我看书上说不能啊
我贴下我的源码 老师你看下
下面是我的按钮槽函数 执行操作 这只是一个按钮 另一个与此相似:
//节流阀&进气歧管清洗
void fuction_2Dialog:n_start2Button_2_clicked()
{
       QSqlQuery query1,query3;
        QDateTime Time1,Time2,Time3;
        QString str_time1,str_function1,str_function2,str,str_time2,str_time3;
        int value,time;
        //获取起始时间
        str_time1 = Time1.currentDateTime().toString();
        str_function1= QObject::tr("节流阀&进气歧管清洗");
        str_function2= QObject::tr("");
        str = QObject::tr("");
        str_time2 = QObject::tr("");
        str_time3 = Time3.currentDateTime().toString("M");
        //使不能
        ui->label_jieliufa->show();
        ui->start2Button_2->setEnabled(false);
        ui->pushButton->setEnabled(false);
        ui->spinBox_2->setEnabled(false);
        //qDebug()<<"str_time3"<<str_time3;
        //插入历史记录
        query1.prepare("insert into car values(?,?,?,?,?,?)");
        query1.addBindValue(str_time1);
        query1.addBindValue(str_function1);
        query1.addBindValue(str_function2);
         query1.addBindValue(str);
        query1.addBindValue(str_time2);
        query1.addBindValue(str_time3);
        query1.exec();
        query1.exec("select *from car");
        //控制按键

           digitalWrite (4,1) ;       // On
        //进度条
        value = ui->spinBox_2->value();

        if(0!=value)
        {
            //插入历史记录
            query3.exec();
            query3.exec("select *from spinBox1");
            query3.last();
            int value1=query3.value(0).toInt();
            //qDebug("spinBox %d",value1);
            ui->spinBox_2->setValue(value1);
            time = value1*60;

        }
        else    //spinbox为0的情况
        {
            query3.exec();
            query3.exec("select *from spinBox1");
            query3.last();
            int value1=query3.value(0).toInt();
            ui->spinBox_2->setValue(value1);
            //qDebug("spinBox %d",value1);
            time = value1*60;
       }
        num_time =time;
       ui->progressBar_jieliufa->setMaximum(time);
       // QProgressDialog process(tr("开始节流阀&进气歧管清洗..."),0,0,time,this);
      //  process.setWindowFlags(Qt::FramelessWindowHint);//隐藏标题栏
       // process.show();
       // process.move(800,300);
      /* for(int i=0;i<time;i++)
        {
             //process.setValue(i);
             ui->progressBar_jieliufa->setValue(i);
             qApp->processEvents();
             QTest::qWait (991);
             //sleep(991);
        }*/
         thread->start();
        //process.setValue(time);//显示100%
       // ui->progressBar_jieliufa->setValue(time);

        //按键关闭
        digitalWrite (4, 0) ;       // Off
        //获取结束时间
        str_time2 =Time2.currentDateTime().toString();
        str_time3 = Time3.currentDateTime().toString("M");
       // qDebug()<<"str_time3"<<str_time3;
        //插入历史记录
        query1.prepare("insert into car values(?,?,?,?,?,?)");
        query1.addBindValue(str_time1);
        query1.addBindValue(str_function1);
        query1.addBindValue(str_function2);
        query1.addBindValue(str);
        query1.addBindValue(str_time2);
        query1.addBindValue(str_time3);
        query1.exec();
        query1.exec("select *from car");
        //蜂鸣器发出警报
         digitalWrite (2, 1);
          QMessageBox msgBox(0);
          msgBox.setText("友情提示!");
          msgBox.setInformativeText("节流阀&进气歧管清洗已完成!");
          msgBox.setStandardButtons(QMessageBox::Yes);
           msgBox.setWindowFlags(Qt::FramelessWindowHint);//隐藏标题栏
           msgBox.setStyleSheet("QPushButton{background-color:rgb(92,203,244)}");
         if(QMessageBox::Yes == msgBox.exec())
         {
            digitalWrite(2,0);
         }
         //恢复
         ui->label_jieliufa->hide();
        ui->start2Button_2->setEnabled(true);
        ui->pushButton->setEnabled(true);
        ui->spinBox_2->setEnabled(true);

        //重新设置进度条1
        ui->progressBar_jieliufa->setValue(0);


}


请问老师 那个线程改如何创建


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

累计签到:14 天
连续签到:1 天
2014-11-24 11:25:32 显示全部楼层
yafeilinux 发表于 2014-11-21 22:17
用多线程来做,不然进入循环之中其他会阻塞的。

老师 多线程我用了 但是我想在线程函数中使用ui->progressbar->setValue(i);控制进度条啊 编译提示没有ui

这个改如何解决呢?
回复

使用道具 举报

累计签到:14 天
连续签到:1 天
2014-11-27 13:25:37 显示全部楼层
zhulei 发表于 2014-11-24 11:25
老师 多线程我用了 但是我想在线程函数中使用ui->progressbar->setValue(i);控制进度条啊 编译提示没有ui ...

问题已解决 采用线程与定时器相结合的方式
回复

使用道具 举报

累计签到:1569 天
连续签到:1 天
2014-12-4 11:50:39 显示全部楼层
zhulei 发表于 2014-11-27 13:25
问题已解决 采用线程与定时器相结合的方式

嗯。最近有事情一直没上线。自己解决了就好!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了