免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3129 | 回复: 10
打印 上一主题 下一主题

[C] 一个简单time()函数循环问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-12-28 19:42 |只看该作者 |倒序浏览
10可用积分
time_t t1;

time_t t2;
t1 = time(NULL);//发送状态报文时间prv时间
                       

while ( 1)
{
        //连接状态报文发送
                               
        t2 = time(NULL);//cur时间
                               
        if( (t2 - t1) >=  RUN_TIME_SPACE_ALIVE1) ‘RUN_TIME_SPACE_ALIVE1 间隔时间值
        {
                       
                sendAliveTelegramToZJ();//给轧机发送状态报文
                                       
                t1 = t2;
                }
}

利用time()函数如何实现每间隔60秒执行sendAliveTelegramToZJ();
谢谢了    我每次调试 t2与t1的时间都是一样大

[ 本帖最后由 lcq6075217 于 2009-12-28 19:48 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2009-12-28 20:01 |只看该作者
CPU估计要杯具了

论坛徽章:
0
3 [报告]
发表于 2009-12-28 20:12 |只看该作者
信号+定时,注册个信号处理函数,用setitimer函数设置定时。

论坛徽章:
0
4 [报告]
发表于 2009-12-28 21:12 |只看该作者

  1. #include <signal.h>
  2.         #include <unistd.h>
  3.         #include <stdio.h>
  4.         #include <sys/time.h>
  5.         int sec = 60;

  6.         void sigroutine(int signo) {
  7.         switch (signo) {
  8.         case SIGALRM:
  9.         printf("Catch a signal -- SIGALRM ");
  10.         //sendAliveTelegramToZJ();
  11.         break;
  12.         case SIGVTALRM:
  13.            //sendAliveTelegramToZJ();
  14.         printf("Catch a signal -- SIGVTALRM ");
  15.         break;
  16.         }
  17.         return;
  18.         }

  19.         int main() {
  20.         struct itimerval value,ovalue,value2;
  21.         

  22.         printf("process id is %d ",getpid());
  23.         signal(SIGALRM, sigroutine);
  24.         signal(SIGVTALRM, sigroutine);

  25.         value.it_value.tv_sec = 1;
  26.         value.it_value.tv_usec = 0;
  27.         value.it_interval.tv_sec = 1;
  28.         value.it_interval.tv_usec = 0;
  29.         setitimer(ITIMER_REAL, &value, &ovalue);

  30.         value2.it_value.tv_sec = 0;
  31.         value2.it_value.tv_usec = 500000;
  32.         value2.it_interval.tv_sec = 0;
  33.         value2.it_interval.tv_usec = 500000;
  34.         setitimer(ITIMER_VIRTUAL, &value2, &ovalue);

  35.         for (;;) ;

  36. return 0;
  37.         }


复制代码

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
5 [报告]
发表于 2009-12-28 22:28 |只看该作者
计算时差来做延时算挺典型的一个bug之一,包括boost库都在延续这种bug.

论坛徽章:
0
6 [报告]
发表于 2010-01-05 13:28 |只看该作者
我用你的代码测试了一下没有问题呀,是否RUN_TIME_SPACE_ALIVE1定义的值太小了,你要是定义成1秒,那肯定每次的值都一样

论坛徽章:
0
7 [报告]
发表于 2010-01-05 14:19 |只看该作者
原帖由 bluewaterray 于 2009-12-28 20:01 发表
CPU估计要杯具了

CPU哇哇的哭

论坛徽章:
0
8 [报告]
发表于 2010-01-05 14:26 |只看该作者
LZ应该起个定时器,注册个回调函数处理

论坛徽章:
0
9 [报告]
发表于 2010-01-06 10:04 |只看该作者
LZ可在循环末尾加个sleep()试试。

论坛徽章:
0
10 [报告]
发表于 2010-01-06 17:13 |只看该作者
原帖由 群雄逐鹿中原 于 2009-12-28 22:28 发表
计算时差来做延时算挺典型的一个bug之一,包括boost库都在延续这种bug.

请问下不用时间差来做定时器,还可以用什么好方法实现?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP