2012-06-24 3 views
1

Я хочу добавить функцию в свой проект.Остановить функции через 5 минут, если они не закончатся

У меня есть 2 функции, выполняющиеся в цикле for, потому что я хочу найти решение функций в случайных массивах. У меня также есть функция, которая делает случайные массивы. В каждом цикле массив, созданный random_array fun, является входом двух функций. 2 функции печатные решения на экране, они не возвращают аргумент.

int main(){ 
    for (i=0;i<50 i++) 
    { 
    arr1=ramdom_array(); 
    func1(arr1) 
    func2(arr1) 
    } 
} 

Мне нужно прекратить выполнение функций, если они не закончились через 5 минут. я подумал, что я должен поставить в функции что-то вроде этого:

void func1(array<array<int,4>,4> initial) 
{ 
while (5minutes_not_passed) 
{ 
//do staff 
if(solution==true) 
break; 
} 
} 

Но я не знаю, что положить в 5minutes_not_passed.

объявление функций, как это:

void func1(array<array<int,4>,4> initial) 
void func2(array<array<int,4>,4> initial) 

Я обнаружил, что я могу использовать библиотеку потока, но я не думаю, что в зацеплении с резьбой в хорошей идеей. Я считаю, что нужно что-то вроде таймера. Обратите внимание, что функции иногда могут заканчиваться до 5 минут.

+3

C++ 11 имеет '', C++ 03 имеет ''. В зависимости от того, много ли вы используете таймеры, я нашел использование '', чтобы сделать пару классов таймера очень приятной деятельностью. Они работают удивительно хорошо. – chris

ответ

3

время_t и раз, чтобы получить текущий второй.

добавить 5 * 60 к этому значению.

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

+0

что в этом плохого? 'time_t thistime; \t thistime = time (NULL); \t thistime = thistime + 60 * 5; \t while (time (NULL)

0

Я знаю, что вы сказали, что вы не хотите использовать потоки, но повышение :: поток будет сделать это очень легко.

boost::thread t(boost::bind(func1, arr1)); 
if(!t1.timed_join(boost::posix_time::minutes(5))){ 
    // thread still running, use interrupt or detach 
} 
0

Или, может быть, вы можете использовать что-то вроде kevents (FREEBSD), который имеет уведомление таймера и обработки сигналов будет делать трюк тоже. http://www.linuxquestions.org/questions/programming-9/how-to-use-sigusr1-and-sigusr2-391489/

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

+0

Ничего себе, поговорите об использовании H-bomb, чтобы убить муравья! –

+0

Истинный .. :-) Но пока организм, о котором идет речь, является муравьем, а не тараканом ... Н-бомбы ... сделайте эту работу! ;-) – Arvind