LINUX.ORG.RU

Выход из функции по таймеру

 ,


0

1

Необходимо, чтобы функция выполнялась по времени не дольше заранее известной величины. То есть

int func_t()
{
...
return -1 ; // выход из функции по причине превышения лимита времени
...
return 0 ; // функция уложилась по времени
}

Спасибо заранее.

Запустить выполнение тела функции в отдельном потоке. Ждать завершения потока, но не более, чем limit времени. Если завершился поток, вернуть результат, иначе вернуть 0 (и опционально прибить поток).

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

Почему? Ответ мы вернули. Поток пусть в фоне дорабатывает своё дело, он уже никому не интересен, если не прибивается, чёрт с ним. Это из предположения, что мы тело функции менять не можем. Если можем, то понятно, что просто проверяем постоянно, не превысили ли мы лимит, блокирующие вызовы делаем с таймаутом и тд, думаю, это очевидно.

Legioner ★★★★★
()
// три секунды максимум
#define MAX_TIME 3 
double dtime(){
	double t;
	struct timeval tv;
	gettimeofday(&tv, NULL);
	t = tv.tv_sec + ((double)tv.tv_usec)/1e6;
	return t;
}

int func_t(){
	double t0;
...
	if(dtime() - t0 > MAX_TIME)
		return -1 ; // выход из функции по причине превышения лимита времени
...
	return 0 ; // функция уложилась по времени
}
Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от podovalov5

t0 = dtime() в том месте, откуда отчет времени начинать. Забыл.

Eddy_Em ☆☆☆☆☆
()

Если Linux-only, то man 2 timer_create на предмет SIGEV_THREAD_ID.

mv ★★★★★
()
Ответ на: комментарий от Eddy_Em
if(dtime() - t0 > MAX_TIME)
		return -1 ; // выход из функции по причине превышения лимита времени

вы забыли указать, что это должно быть в цикле

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

Это очевидно.

А вообще, где-то я уже такую шнягу делал: оно ждало данных секунд 10, постоянно запуская select, а если ничего не приходило, отваливалось с ошибкой. Кажись, это была какая-то древняя терминальная дрыгалка объективом canon.

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