执行不同迭代任务的计数器循环

我正在用C编写此代码,假设我有一个计时器计数器,该计数器从外部设备获取值。为简单起见,我将使用最多为10的for循环。

然后我有一个action()函数,其功能是在不同的时间执行任务。

int action (int counter) 
{
   if (counter == 1) //1st sec,hardcoded
      // do task 1
   if (counter == 2) //2nd sec,hardcoded
      // do task 2
   if (counter == 3 + 4) //7th sec (4 sec delay added)
      // do task 3
    //and so on
   //how do I count the total seconds elapsed?
   return seconds_elapsed;
}

int main (void)
{
    for (int timer = 0; timer < 10; timer++)
         action(timer);
    return 0;
}

我不喜欢在action()函数中对计时器计数器进行硬编码。想象一下,您在3600秒内完成了数百项任务。在上面的代码样式中,您将必须手动跟踪延迟。我想使用变量或数据结构来跟踪延迟,并可能在下一次迭代时递增。最好的方法是什么?

tns1986 回答:执行不同迭代任务的计数器循环

两个选择:滚动拥有或使用库:

  • 拥有自己的角色:考虑将每个不同的动作分解为一个函数,并使用带有函数点的数组。然后,“操作”将变为查找。

  • 使用一个库-如果要执行数百个动作,请考虑使用诸如libevent之类的库或其他事件处理库。请参阅下面的一些指针。

展示自己拥有的示例代码:


typedef void (*action_func)(void) ;

void action_a(void) {
}

void action_b(void) {
}

truct {
   int id ;
   action_func f ;
} action_table[] = {
   { 1,action_a },{ 2,action_b }
} ;

int action (int counter)
{
    int n_actions = sizeof(action_table)/sizeof(action_table[0]) ;
    for (int i=0 ; i <n_actions ; i++ ) {
       if ( counter == action_table[i].id ) {
          action_table[i].f() ;
          break ;
       } ;
    }
    return seconds_elapsed ;
}

添加/更改动作需要更新表。您可以在表格中添加附加属性以更改状态等。

更新1-基于C的cron /事件库

重量轻:

https://

一般用途-可能过大了

,

我接受这种设计。 将代码分为两种功能以使代码可读-一种功能基于计数器进行决策,第二种功能只是基本处理程序。

#include <stdio.h>

typedef int (*scheduler)(int);
typedef void (*worker)(void);

typedef struct event {
    scheduler is_it_time_to_run_task;
    worker task_handle;
} event_t;


int every_five_seconds(int ticks){
    return (ticks % 5) == 0;
}

int every_hour(int ticks){
    return (ticks % 3600) == 0;
}

void sound_the_bell(){
    printf("bell\n");
}

void do_some_check(){
    printf("check\n");
}

int z=0;
int get_counter_from_device(){
    return ++z;
}

int main(){

    event_t events[]={
        {every_hour,sound_the_bell},{every_five_seconds,do_some_check},{NULL,NULL}
    };

    while(1){ //read some value from device
        int counter = get_counter_from_device();
        printf("counter: %d\n",counter);
        for(event_t *event=events;event->is_it_time_to_run_task;event++){
            if(event->is_it_time_to_run_task(counter)){
                event->task_handle();
            }
        }
    }
    return 0;
}
本文链接:https://www.f2er.com/2995753.html

大家都在问