Использование таймера

Автор: frp Дата: 16.06.2007 20:07 В программировании у меня возникла проблема. Не умею создать таймер. Альтернативные методы с потоками не удались изза того, что в Линуксе это сделать я не умею. Помогите решить проблему (среда, в которой работаю - KDevelop).
Re: Использование таймера 16.06.2007 20:21peter_ir KDevelop никогда не использовал, а насчёт таймера - man setitimer и т.д.
Re: Использование таймера 16.06.2007 21:34Bircoph Можно ещё alarm() использовать и обработчик сигнала написать.
Re: Использование таймера 20.06.2007 02:29knzsoft Программируя в user space использую библиотеку Qt - там все это есть Улыбка
Re: Использование таймера 20.06.2007 14:16Bircoph alarm в unistd.h, то бишь в glibc.
И qt тут ни при чём.
Re: Использование таймера 06.07.2007 23:53CL вот когда то себе набросал и очень долго использовал в различных Си программах.
тут все несколько урезанно, если будет интересно пиши.

struct _timer_data
{
time_t last_event_time;
unsigned int interval;
void *data;
int (*fun) (void *);
struct _timer_data *next;
struct _timer_data *prev;
};

static timer_data *timer_data_first;
static timer_data *timer_data_last;
static unsigned int CurrValMTimer;

static void m_timer(int signo)
{
if(signo==SIGALRM)
CurrValMTimer++;
}

void timers_init(void)
{
struct itimerval val;

timer_data_first=NULL;
timer_data_last=NULL;
CurrValMTimer=0;
init_sig_hndlr(SIGALRM,m_timer);
val.it_interval.tv_sec=1;
val.it_interval.tv_usec=0;
val.it_value.tv_sec=1;
val.it_value.tv_usec=0;
if(setitimer(ITIMER_REAL,&val,0)==-1)
exit(123);
}

timer_data *timer_add(unsigned int interval,int (*fun)(void *),void *data)
{
timer_data *td_add;

td_add=(timer_data*)malloc(sizeof(timer_data));
td_add->interval=interval;
td_add->data=data;
td_add->fun=fun;
td_add->last_event_time=CurrValMTimer;
td_add->next=NULL;
td_add->prev=timer_data_last;
if(timer_data_last!=NULL)timer_data_last->next=td_add;
else timer_data_first=td_add;
timer_data_last=td_add;
return td_add;
}

void timer_work(void)
{
timer_data *td_curr;
unsigned int reztime;

td_curr=timer_data_first;
while(td_curr!=NULL)
{
reztime=CurrValMTimer-td_curr->last_event_time;
if(reztime>=td_curr->interval)
{
if(td_curr->fun(td_curr->data)==0)
{
td_curr=timer_remove(td_curr);
continue;
}
td_curr->last_event_time=CurrValMTimer;
}
td_curr=td_curr->next;
}
}

int main()
{
timers_init();
timer_add(10,fun1,NULL);//таймер на 10 сек. с обработчиком fun1
timer_add(100,fun2,NULL);//на 100 сек.
while(1)
{
timer_work();
...
}
return 0;
}
RSS-материал