【发布时间】:2012-05-10 16:03:16
【问题描述】:
实际上我想实现非阻塞计时器,当计时器到期时,将调用处理程序并执行某些操作(现在它打印数据)。我谷歌并意识到timer_create、timer_settimer 是非阻塞计时器。但是我仍然有问题,我必须等待我的计时器到期(sleep(MAX) 或while(1) {;})。但是,如果我用不同的“到期”时间调用我的 start_timer 方法,它应该相应地工作,不应该阻止其他。例如这里我第一次调用计时器,并期望在 5 秒内调用处理程序,但在第二次调用之前应该打印它的数据,我给出的间隔仅为 1 秒。当然,它的行为也不一样。有什么想法吗?
#include <time.h>
#include <stdio.h>
#include <signal.h>
#include <pthread.h>
#include <unistd.h>
#include <errno.h>
typedef struct _data{
char *name;
}data;
void handler(union sigval val)
{
data *data_handler = val.sival_ptr;
printf("Handler entered with value :%s\n", data_handler->name);
}
void mod_timer(timer_t timerid, struct sigevent sig, struct itimerspec in, struct itimerspec out)
{
printf("mod_timer\n");
timer_settime(timerid, 0, &in, &out);
while(1)
sleep(1);
//delete the timer.
timer_delete(timerid);
}
void start_timer(void* val, int interval)
{
int Ret;
pthread_attr_t attr;
pthread_attr_init( &attr );
struct sched_param parm;
parm.sched_priority = 255;
pthread_attr_setschedparam(&attr, &parm);
struct sigevent sig;
sig.sigev_notify = SIGEV_THREAD;
sig.sigev_notify_function = handler;
// sig.sigev_value.sival_int = val;
sig.sigev_value.sival_ptr = val;
sig.sigev_notify_attributes = &attr;
//create a new timer.
timer_t timerid;
Ret = timer_create(CLOCK_REALTIME, &sig, &timerid);
if (Ret == 0)
{
struct itimerspec in, out;
in.it_value.tv_sec = 1;
in.it_value.tv_nsec = 0;
in.it_interval.tv_sec = interval;
in.it_interval.tv_nsec = 0;
mod_timer(timerid, sig, in, out);
}
}
void main()
{
// start_timer(1, 5);
// start_timer(2, 1);
data handler_data1 = {"Handler Data 1"};
data handler_data2 = {"Handler Data 2"};
void *data1 = &handler_data1;
void *data2 = &handler_data2;
start_timer(data1, 5);
start_timer(data2, 1);
}
【问题讨论】:
-
为什么不给定时器一个单独的线程?
-
这段代码的目标是什么?这似乎更像是一个设计缺陷而不是计时器问题。
-
@Dave 是的,不完全是计时器问题,我的目标是正如我所说,我想在“间隔”延迟之后执行处理程序(执行任务)。例如,从这段代码中,data1 应该在 5 秒后执行,data2 应该在 1 秒后执行。即,一旦我在 1 秒内开始执行,data2 将被执行,再过 4 秒,data1.
-
@noMAD 你能详细说明一下吗,可能一些伪代码会有所帮助
-
@noMAD,我尝试使用线程,在 start_timer 和线程方法中创建线程作为 mod_timer,但仍然在 start_timer 中我必须执行 pthread_join(thread_id),对吗?所以这再次暂停了其他调用的执行。 (这里是数据2)。 :(((
标签: c timer sleep signals nonblocking