実際には、ノンブロッキング タイマーを実装したいと考えています。タイマーが期限切れになると、ハンドラーが呼び出されて何かを実行します (今のところ、データを出力します)。timer_create
私はグーグルで、timer_settimer
がノンブロッキングタイマーであることに気付きました。しかし、まだ問題があります。タイマーが期限切れになるまで待つ必要があります (sleep(MAX)
またはwhile(1) {;}
)。しかし、異なる「有効期限」時間でメソッドを呼び出している場合start_timer
、それに応じて機能し、他のものをブロックするべきではありません。たとえば、ここで初めてタイマーを呼び出し、5 秒でハンドラーを呼び出すことを期待していますが、2 回目の呼び出しでそのデータを出力する前に、指定した間隔は 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);
}