---恢復內容開始---
摘要
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標志量
---恢復內容結束---