/*
//读取实时数据
StrData ReadRealData(int beginTime ,int endTime);
//读取实时时间
StrTime ReadRealTime();
*/
//我们从实时库中每秒中读一次数据,这就需要我们要保证数据的连贯性。
void func()
{
StrTime newTime;
StrTime oldTime;
memset(&newTime,0,sizeof(StrTime);//局部变量一定要先初始化
memset(&oldTime,0,sizeof(StrTime);//局部变量一定要先初始化
StrData RealData;
vector<StrData> VData;
while(1)
{
newTime = ReadRealTime();
if(newTime.sec<=oldTime.sec)
{
usleep(200);//因为我们是取1s的数据,故此处延时不能用sleep函数
continue;
}
oldTime = newTime;
RealData = ReadRealData(newTime.sec-11 ,newTime.sec-10);//实时库中可以取比当前时间早1-2min中的数,此处取早11秒的数
VData.pushbach(RealData);
//do sth.
}
}
小结:
1)以上程序通过两个时间,来保证时间的连续性。
2)oldTime一定要初始化,如未初始化,oldTime.sec可能会是一个很大的数,这样就可能导致if(newTime.sec<=oldTime.sec)一直成立,程序进入死循环。
3)上述程序存在一个问题,就是200us就读取一次实时时间函数ReadRealTime(),这样太频繁了。我们修正为以下情况:
/*
//读取实时数据
StrData ReadRealData(int beginTime ,int endTime);
//读取实时时间
StrTime ReadRealTime();
*/
//我们从实时库中每秒中读一次数据,这就需要我们要保证数据的连贯性。
void func()
{
StrTime newTime;
StrTime oldTime;
memset(&newTime,0,sizeof(StrTime);//局部变量一定要先初始化
memset(&oldTime,0,sizeof(StrTime);//局部变量一定要先初始化
StrData RealData;
vector<StrData> VData;
while(1)
{
//添加gettimeofday
struct timeval time_start,time_end;
gettimeofday(&time_start,NULL);
newTime = ReadRealTime();
if(newTime.sec<=oldTime.sec)
{
usleep(200);//因为我们是取1s的数据,故此处延时不能用sleep函数
continue;
}
oldTime = newTime;
RealData = ReadRealData(newTime.sec-11 ,newTime.sec-10);//实时库中可以取比当前时间早1-2min中的数,此处取早11秒的数
VData.pushbach(RealData);
//do sth.
//添加gettimeofday
gettimeofday(&time_end,NULL);
int spanTime = time_end.tv_sec - time_start.sec;
spanTime = spanTime*1000000 + time_end.tv_usec - time_start.tv_usec;
if(1000000 - spanTime >0)
usleep(1000000 - spanTime); //这就保证了不会频繁的读取实时库。
}
}