繁体   English   中英

如何处理多个计时器信号

[英]How to handle multiple timer signals

int main ()
{
        int i=0;
        timer_t t_id[100];
        for(i=0; i<100; i++)
        makeTimer(NULL, &t_id[i], i+1, 0);

        /* Do busy work.  */
        while (1);
}





static int makeTimer( char *name, timer_t *timerID, int sec, int msec ) 
    { 
        struct sigevent         te; 
        struct itimerspec       its; 
        struct sigaction        sa; 
        int                     sigNo = SIGRTMIN; 

        /* Set up signal handler. */ 
        sa.sa_flags = SA_SIGINFO; 
        sa.sa_sigaction = timer_handler; 
        sigemptyset(&sa.sa_mask); 

        if (sigaction(sigNo, &sa, NULL) == -1) 
        { 
            printf("sigaction error\n");
            return -1; 
        } 

        /* Set and enable alarm */ 
        te.sigev_notify = SIGEV_SIGNAL; 
        te.sigev_signo = sigNo; 
        te.sigev_value.sival_ptr = timerID; 
        timer_create(CLOCK_REALTIME, &te, timerID); 

        its.it_interval.tv_sec = sec;
        its.it_interval.tv_nsec = msec * 1000000; 
        its.it_value.tv_sec = sec;

        its.it_value.tv_nsec = msec * 1000000;
        timer_settime(*timerID, 0, &its, NULL); 

        return 0; 
    }

    static void timer_handler( int sig, siginfo_t *si, void *uc ) 
    { 
        timer_t *tidp;
        tidp = si->si_value.sival_ptr;

       /* how to know the timer_id with index? */
    }

在此代码上,我制作了许多计时器,这些计时器的ID由数组结构组成。

如果发生超时事件,则所有计时器共享一个timer_handler。 但是我怎么知道哪个索引的(t_id [index])超时了?

可能吗? 我的意思是我想知道哪个索引发生了超时。

一个使用结构的简单示例:

struct timer_event_data
{
    timer_t id;
    size_t  index;  // Array index, not really needed IMO
    // Other possible data
};

#define NUMBER_TIMER_EVENTS 100

int main(void)
{
    struct timer_event_data timer_data[NUMBER_TIMER_EVENTS];

    for (size_t i = 0; i < NUMBER_TIMER_EVENTS; ++i)
    {
        // Initialize structure
        timer_data[i].index = i;

        // Start timer
        makeTimer(NULL, &timer_data[i], i + 1, 0);
    }

    // Main processing loop
    for (;;)
    {
        // ...
    }

    return 0;
}

void makeTimer(const char *name, struct timer_event_data *timer_data, unsigned sec, unsigned msec)
{
    ...
    te.sigev_value.sival_ptr = timer_data;
    timer_create(CLOCK_REALTIME, &te, &timer_data->id);
    ...
}

static void timer_handler( int sig, siginfo_t *si, void *uc ) 
{
    struct timer_event_data *timer_data = si->si_value.sival_ptr;
    // Use data in structure any way you want
}

可以定义一个指向t_id的第一个元素的全局指针:

timer_t * pt_id;

main()初始化它:

timer_t t_id[100];
pt_id = t_id;

然后在计时器函数内部,通过将差异取到数组来计算所需的索引,如下所示:

  size_t tidx = tidp - pt_id - 1;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM