我有一个从传感器删除一些手指打印的方法,首先我从数据库中加载了它的id列表,然后我创建了写命令(在串口上写)以删除每个ID:DeleteFP(int id)
数据是正确的,并将其写在我的端口上,但我想创建一个循环来删除我发送id的所有指纹,所以我创建了一个简单的循环:
bool FP::DeleteFP(int id)
{
ClearTemplate(id);//write on port to clear dada
clearTmpStatus=false;//if this id deleted then it make true// global variable
int t=0;
do
{
t++;
if(checkDelFP())
{
clearTmpStatus=false;
qDebug()<<"t is: "<<t<<"clear status is"<<clearTmpStatus;
return true;
}
if(/*clearTmpStatus ||*/ t==1000)
{
qDebug()<<"t is: "<<t<<"clear status is"<<clearTmpStatus;
return false;
}
}while(1);
return clearTmpStatus;
}
bool FP::checkDelFP()
{
if(clearTmpStatus )
{
qDebug()<<"clear status is"<<clearTmpStatus;
FPCancel();
}
}
读取方法(来自串口)在一个线程中,当我调用删除指纹方法时,它向指纹设备发送删除命令,然后设备响应成功删除我的线程并更改全局变量{{1从false到true,我使用循环来检查clearTmpStatus
的值,我认为GUI停止并且循环调用另一个函数来检查clearTmpStatus
,当它改变循环得到改变时,但是当循环工作时,变化不会影响,循环停止并完成后发生变化。问题出在这里,如何在线程更改其值后检查全局变量的变化?有没有解决方案?
答案 0 :(得分:1)
在C++11
之后阅读全局变量的正确方法是通过std::atomic
阅读它们。
编译器确保将更改正确传播到程序的各个部分。
在C++11
之前,有必要将变量创建为volatile
。这阻止了编译器创建值的缓存。
让编译器意识到值可以在正在运行的任何流程之外进行更改是很重要的。