石器时代LA官方

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 6611|回复: 0

[基础教材] 随机定时器

[复制链接]

1万

主题

491

回帖

3万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
35549
石币
24710
发表于 2013-9-27 15:32:10 | 显示全部楼层 |阅读模式
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. #ifndef FALSE
  5. #define FALSE 0
  6. #endif
  7. #ifndef TRUE
  8. #define TRUE 1
  9. #endif
  10. /**
  11. * 随机定时器:一个定时器,它的定时有一定的随机性。
  12. *
  13. * 本函数是随机定时器的核心部分
  14. *
  15. * 用法:一个单独的线程反复调用此函数,返回TRUE执行任务,FALSE则不执行
  16. *
  17. * 实用例子:成千上万的客户程序定时从服务器查询一些数据,
  18. *         并希望分散查询时间,减轻被查询的服务器的压力。
  19. *
  20. * @param range 定时器的时间间隔(也即隔多长时间执行一次)
  21. * @param mistake 误差,单位为秒,比调用此函数的时间间隔大一点即可
  22. *
  23. * @return 返回TRUE执行任务,FALSE则不执行
  24. */
  25. int is_rtime(int range, int mistake)
  26. {
  27.    static time_t upper    = -1;
  28.    static time_t lower    = -1;
  29.    static time_t random   = -1;
  30.    static int run         = FALSE;
  31.    time_t current;
  32.    // 获取当前时间
  33.    if( -1 == (current = time(NULL)) ){
  34.       return FALSE;
  35.    }
  36.    // 设置时间
  37.    if( upper == -1      ||   // 第一次执行,要初始化
  38.        current >= lower ){   // 过了下限,重新设置时间
  39.       upper    = current;
  40.       lower = upper + range;
  41.       srand(upper);
  42.       random = upper + rand() % range;
  43.       run = FALSE;
  44.       return FALSE;
  45.    }
  46.    //到了某个时间段,并且只能在这个时间段内执行一次
  47.    if( abs(current - random) < mistake && run == FALSE ){
  48.       run = TRUE;
  49.       return TRUE;
  50.    }
  51.    return FALSE;
  52. }
  53. int main()
  54. {
  55.    int secondsofday = 24 * 60 * 60;
  56.    while(1)
  57.    {
  58.       if( is_rtime(10, 1) ){
  59.          time_t t;
  60.          t = time(NULL);
  61.          printf("%s", ctime(&t));
  62.       }
  63.       sleep(1);
  64.    }
  65. }
复制代码
成千上万的客户程序定时从服务器查询一些数据,并希望分散查询时间,减轻被查询的服务器的压力。一个随机定时器能够实现这个要求。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|石器时代LA官方

GMT+8, 2024-5-6 09:33 , Processed in 0.107382 second(s), 24 queries .

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表