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標志量 

  

 

---恢復內容結束---


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM