2

実際には、ノンブロッキング タイマーを実装したいと考えています。タイマーが期限切れになると、ハンドラーが呼び出されて何かを実行します (今のところ、データを出力します)。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);
}
4

1 に答える 1

0

関数を使用しalarmてシグナルを生成し、関数を使用signalしてそのシグナルへのハンドラーを指定できます。

于 2012-12-10T14:06:29.570 に答える