LINUX.ORG.RU

Условие выхода из цикла по истечению 5 секунд

 ,


0

1

Задумал реализовать такой цикл:

do {
rez = func() ;
} while (rez != 42 && пока не прошло 5 секунд) ;
То есть выход из цикла или тогда, когда функция вернет ответ на вопрос жизни вселенной и всего остального, или тогда, когда пройдет 5 секунд а ответа на вопрос так и не будет найдено. Извините, за неуместный юмор.
Как добавить это условие: «пока не прошло 5 секунд». Подскажите, пожалуйста.



Последнее исправление: podovalov5 (всего исправлений: 1)

Ответ на: комментарий от Deleted

А вот так-то можно???:

#include <time.h>

int main(void)
{
    int rez ;
    time_t start_time = time(NULL);
    do {
       rez = func();
    } while ((time(NULL) <= start_time + 5) && rez != 42);
    return 0;
}
Мне надо «или то, или то».

podovalov5
() автор топика

Так вроде или менять func надо, или с потоками заморачиваться.

amomymous ★★★
()

Варианта два: либо потоки, либо прерывания. Поскольку последнего на прикладном уровне нет, остаются потоки.

asaw ★★★★★
()

Только недавно была та же самая хрень. Ну неужто нельзя в поиск залезть? Ищи dtime

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Deleted

Не работает, если func выполняется дольше, чем 5 секунд или не кратно укладывается в 5.

anonymous
()
Ответ на: комментарий от Eddy_Em

Нет, ну ты вообще издеваешься!!!

Мне показалось, что задачи немного разные. А вообще, каюсь. Поленился. Мог бы даже погуглить.

podovalov5
() автор топика
Ответ на: комментарий от Eddy_Em

Но для этого придется либо форк делать, либо запускать отдельный поток (который в обработчике сигналов будет pthread_cancel), либо устанавливать в обработчике условную переменную (а в while проверять ее).

Все зависит от того, насколько точно тебе временные рамки надо определить.

Eddy_Em ☆☆☆☆☆
()

Я думаю, тебе ещё рано об этом говорить, но если ты отмеряешь интервал времени, то надо пользоваться монотонными часами.

pathfinder ★★★★
()

форкаешься, запускаешь функцию, убиваешь форк девяткой по таймауту

Reset ★★★★★
()
Ответ на: комментарий от asaw

Варианта два: либо потоки, либо прерывания. Поскольку последнего на прикладном уровне нет, остаются потоки.

Прерываний нет, но есть сигналы. Хотя это, скорее, способ выстрелить себе в ногу, чем получить предсказуемую работу:

#include <stdio.h>
#include <unistd.h>
#include <setjmp.h>
#include <signal.h>
#include <math.h>

static jmp_buf jb;

static void handle_alarm(int sig_num)
    {
    (void)sig_num;
    longjmp(jb, 1);
    }

static void do_42(void)
    {
    double v = 0.0;

    while(v != 42.)
        {
        int i;

        for(i = 0; i < 1000000; ++i)
            v = v + sin(i);

        printf("Calculating: %g \r", v);
        fflush(stdout);
        }
    }

int main(void)
    {
    if(setjmp(jb) == 0)
        {
        struct sigaction act;

        act.sa_handler = handle_alarm;
        sigemptyset(&act.sa_mask);
        act.sa_flags = SA_RESETHAND;
        sigaction(SIGALRM, &act, NULL);

        alarm(5);

        do_42();

        printf("\nGot answer!\n");
        }
    else
        printf("\nTimeout!\n");

    return 0;
    }

И никаких потоков и процессов :)

cdslow ★★
()

&&

или тогда

или

Тебе ещё и | от & надо учиться отличать

anonymous
()

Как добавить это условие: «пока не прошло 5 секунд»

Юниксвей вариант:

$ timeout 5s ./calc-answer
anonymous
()
Ответ на: комментарий от cdslow

Хотя это, скорее, способ выстрелить себе в ногу, чем получить предсказуемую работу

Почему? В обработчике установить переменную, в цикле её проверять. Будет предсказуемо и безопасно.

crowbar
()
Ответ на: комментарий от kawaii_neko

gettimeofday/clock рреализованы через vdso и имеют малый оверхед

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.