qt线程如何接收linux信号,Linux-Qt使用QThread多线程isRunning标志量问题

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

摘要

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

bool QThread::isRunning () constReturnstrue 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()<

QSqlQuery query(db);

if( !query.exec( str ))

{

qCritical()<

}

while (query.next()) {

//qDebug()<

rowNum = query.at();//结果集的编号也就是行号

columnNum = query.record().count();//结果集中列的个数

fieldNo_longitude = query.record().indexOf("经度");

fieldNo_latitude = query.record().indexOf("纬度");

//qDebug()<

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

voidDisplay_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()<

Display_PlayBack::dataPlayBack.mutex.unlock();//判断数据库读取线程是否关闭

if( (!thread_playBack->isRunning()) || (thread_playBack->isFinished()) )

{

qDebug()<

thread_playBack->closeThread();

}

}

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

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