• Linux-Qt使用QThread多线程isRunning标志量问题


    ---恢复内容开始---

     

    摘要

    Qt帮助文档中是这样介绍的:

    bool QThread::isRunning () const
    Returns true if the thread is running; otherwise returns false.
    
    See also isFinished().

    解释的一本正经,使用却不然。

    问题:

    使用QThread::isRunning标志量判断线程是否关闭时,判断出错,线程明明关闭,isRunning仍然显示true

    解决方式:

    使用isRunning isFinished双标志量判断

    程序说明:

    界面程序(Display_PlayBack)负责显示数据,数据库读取线程(Thread_PlayBack)负责一直读取数据库。

    界面程序创建的数据库线程,也负责回收其空间。

    程序中的代码:

    Thread_PlayBack.cpp

    void Thread_PlayBack::run()//一直读取数据库数据入缓存
    {
        int rowNum,columnNum,fieldNo_longitude,fieldNo_latitude;
        double x,y,scale;
        SqlData data;
        QString str = QString::fromUtf8("SELECT 经度,纬度 FROM HT_12 WHERE (航向!=0 or 航速!=0"
                                        " or 航程!=0 or 距离!=0) and ( 总电压!=0 or 总电流!=0 )"
                                        "and 系统工作时间>'2000-01-10 03:08:25' and 航次=%1;").arg(voyage_num);
        qDebug()<<"sql_str="<<str;
    
        QSqlQuery query(db);
        if( !query.exec( str ))
        {
            qCritical()<<"exec failed!";
        }
        while (query.next()) {
            //qDebug()<<"开始读取";
            rowNum = query.at();//结果集的编号也就是行号
            columnNum = query.record().count();//结果集中列的个数
            fieldNo_longitude = query.record().indexOf("经度");
            fieldNo_latitude = query.record().indexOf("纬度");
            //qDebug()<<"行:"<<rowNum<<" 列:"<<columnNum<<endl;
    
            x = query.value( fieldNo_longitude ).toDouble();
            y = query.value( fieldNo_latitude ).toDouble();
            scale=qPow(10,-7);
            if(rowNum==0){//记录
            }
    
            data.longtitude = QString::number(x*scale,10,5);//QString中的number函数转换
            data.latitude   = QString::number(y*scale,10,5);//参数:double值,进制格式,几位小数
            Display_PlayBack::dataPlayBack.mutex.lock();
            Display_PlayBack::dataPlayBack.sqlData.append(data);
            Display_PlayBack::dataPlayBack.mutex.unlock();
    
        }//读取完数据就跳出循环,然后依次结束自己
        QMutexLocker locker(&mutex);//run结束时,标志量isStop设为真,代表关闭了数据库连接
        isStop = true;
        SqlConnectionPool::closeConnection(db);
    
        //关闭数据库读取线程
        qDebug()<<"读取完毕,关闭自身!";
        this->closeThread();
        return;
    }
    
    void Thread_PlayBack::closeThread()
    {
        QMutexLocker locker(&mutex);
        if(false == isStop)//如果标志量isStop为假,说明提前结束线程,需要手动关闭连接
        {
            SqlConnectionPool::closeConnection(db);
        }
        this->quit();
        this->wait();//标准线程结束释放
    }
    

    display_playback.cpp

    void Display_PlayBack::on_Button_End_clicked()
    {
        qDebug()<<"终止回放";
        ui->Button_Start->setText(QString::fromUtf8("开始"));
        ui->Button_Start->setChecked(false);
        //-----------航次选择combox设置为可选取----------//
        ui->ComboBox_Voyage->setEnabled(true);
        //静态变量置空
        Display_PlayBack::dataPlayBack.mutex.lock();
        Display_PlayBack::dataPlayBack.sqlData.erase(Display_PlayBack::dataPlayBack.sqlData.begin()
                                                    ,Display_PlayBack::dataPlayBack.sqlData.end());
        qDebug()<<"静态缓存size="<<Display_PlayBack::dataPlayBack.sqlData.size();
        //vector::erase()用于清空容器中的内容以及释放内存,并返回指向删除元素的下一个元素的迭代器。
        Display_PlayBack::dataPlayBack.mutex.unlock();
        //判断数据库读取线程是否关闭
        if( (!thread_playBack->isRunning()) || (thread_playBack->isFinished()) )
        {
            qDebug()<<"线程还没结束";
            thread_playBack->closeThread();
        }
    }

    解决!!!主要还是判断的isFinished标志量 

      

    ---恢复内容结束---

  • 相关阅读:
    获得客户端的信息
    JavaScript--垃圾回收器
    JavaScript--函数-按值传递
    JavaScript--声明提前
    JavaScript--函数-01
    JavaScript--赋值表达式(typeof-delete-void)
    JavaScript—赋值表达式-1
    JavaScript--机选双色球
    正则表达式的预判
    自定义比较器函数
  • 原文地址:https://www.cnblogs.com/shuoguoleilei/p/11405404.html
Copyright © 2020-2023  润新知