描述下大致功能:需要监测某个变量或整个函数返回值是否发生变化,若发生了变化,将变化的值传出去,若5分钟内该变量值还没有变化,变量也会继续传出去。
用处:监测某个预警值,发生警告了就处理,但是又不想一直发送,发生了新的告警信息才发送,如果同一个告警信息,一段时间没有处理,需要再次发生该告警信息,及时处理告警。
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int monitor_var();
void main()
{
int monitor;
int i=0;
static int monitor_var_keep;
int start,finish;
float total_time=0;
while(1)
{
while(1)
{
start =time(NULL);//记录本次监测变量开始的时间
monitor = monitor_var();
/*monitor_var_keep=0是因为第一次执行或者检测monitor是否发生变化*/
if((monitor_var_keep==0)|(monitor!=monitor_var_keep))
{
monitor_var_keep = monitor;
break;
}
finish = time(NULL);//记录本次监测变量结束时间
total_time +=(float)(finish-start);//记录监测变量总时间
printf("total_time is %f\n",total_time);
if(total_time>=3.0)//当监测3s没有发生变化,总时间清零,并退出循环。
{
total_time=0;
break;
}
}//end while
/*只有退出上一层while循环才会执行后续的3个打印语句。*/
printf("monitor is %d\n",monitor);
printf("monitor_var_keep is %d\n",monitor_var_keep);
/*此处根据需要写处理监测变量的函数,例如进行UDP通信,将数据发送到服务端*/
printf("recycle %d time\n",++i);
}//end while。
}//end main。
int monitor_var()
{
int i=1;
srand(time(NULL));
i = rand()%3+1;
sleep(1);
printf("i = %d\n",i);
return i;
}
从执行的结果可以看出第一次执行 i =2,会退出第一层while循环(执行了3个打印语句),第二次第三次也因为i的值确实发生了变化,退出了while循环。
第四次i=3,与上一次结果一样,并没有变化,而且时间也少于3s,没有退出,继续监测。
从图上看“recycle 8 time”后三次执行结果,i =3没有变化,但是第三次i = 3的时候,超过了规定时间3s没有变化,再发生一次监测变量,以便处理。
综上结果分析,算是符合了要求。
/本人当时做UDP数据传输时,需要实时监测trap PDU是否发生变化。如果一段时间没有处理该trap,就继续发送!/
/有问题欢迎指正。。。/