标签:标准 star 个数 进制 ble thread cli family erase
---恢复内容开始---
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标志量问题
标签:标准 star 个数 进制 ble thread cli family erase
原文地址:https://www.cnblogs.com/shuoguoleilei/p/11405404.html