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

Posted shuoguoleilei

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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标志量 

  

 

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

以上是关于Linux-Qt使用QThread多线程isRunning标志量问题的主要内容,如果未能解决你的问题,请参考以下文章

QThread 完成状态

如何在 QT 中停止 qThread [重复]

QThread与多线程(比较清楚)

带有 QThread 和线程模块的 Python 多线程

QtConcurrent 与多线程 QThread 的多线程性能

Qt多线程-QThread