запустить бесконечный цикл на некоторое время в с - PullRequest
1 голос
/ 26 октября 2010

Я хочу на некоторое время запустить бесконечный цикл. В принципе, я хочу что-то вроде этого

//do something

while(1){
  //do some work
}

//do some other thing

но я хочу, чтобы время цикла было фиксированным, например, цикл может работать в течение 5 секунд. У кого-нибудь есть идея?

Ответы [ 6 ]

9 голосов
/ 26 октября 2010

Попробуйте использовать часы ().

#include <time.h>

clock_t start = clock();

while (1)
{
    clock_t now = clock();
    if ((now - start)/CLOCKS_PER_SEC > 5)
        break;

    // Do something
}
9 голосов
/ 26 октября 2010

Просто сделайте sleep(5) (включая unistd.h). Вы можете использовать это так:

// do some work here
someFunction();    

// have a rest
sleep(5);

// do some more work
anotherFunction();

Если вы выполняете работу внутри цикла, вы можете сделать (включая time.h):

// set the end time to the current time plus 5 seconds
time_t endTime = time(NULL) + 5;

while (time(NULL) < endTime)
{
    // do work here.
}
1 голос
/ 26 октября 2010

Прежде всего, рассмотрите возможность использования функции sleep, если это возможно.Если вам придется выполнять реальную работу в течение определенного периода времени, что я считаю маловероятным, будет работать следующее уродливое решение:

#include <signal.h>
int alarmed = 0;
void sigh(int signum) {
    alarmed = 1;
}
int main(void){
    /* ... */
    signal(SIGALRM, &sigh);
    alarm(5); // Alarm in 5 seconds
    while(!alarmed) {
        /* Do work */
    }
    /* ... */
}

Решение, использующее time.h, также возможно, и, возможно, будет проще и /или более точный, в зависимости от контекста:

#include <time.h>
int main(void){
    /* ... */
    clock_t start = clock();
    while(clock() - start < 5 * CLOCKS_PER_SEC) {
        /* Do work */
    }
    /* ... */
}
0 голосов
/ 26 октября 2010

Если вы не хотите вызывать функцию получения времени каждый раз через цикл и находитесь в системе с alarm (POSIX, например, Unix, Linux, BSD ...), вы можете сделать:

статическое энергозависимое int timeout = 0;

void handle_alrm(int sig) {
     timeout = 1;
}

int main(void) {
    signal(SIGALRM, handle_alrm);
    ...
    timeout = 0;
    alarm(5);
    while (!timeout) {
       do_work();
    }
    alarm(0); // If the signal didn't fire yet we can turn it off now.
    ...

У сигналов могут быть другие побочные эффекты (например, вышибание вас из системных вызовов). Вы должны изучить их, прежде чем полагаться на них.

0 голосов
/ 26 октября 2010

Не проверено; разрешение очень грубое.

#include <time.h>
#define RUNTIME 5.0 /* seconds */

double runtime = 0;
double start = clock(); /* automatically convert clock_t to double */
while (runtime < RUNTIME / CLOCKS_PER_SEC) {
    /* work */
    runtime = clock() - start;
}

Если / * работа * / занимает более 5 секунд, цикл займет более 5 секунд.

Если / * работа * / занимает 1,2 секунды, цикл будет выполняться приблизительно 5 раз в течение 6 секунд

0 голосов
/ 26 октября 2010

Псевдо-код:

starttime = ...;

while(currentTime - startTime < 5){

}
...