2012-04-04 2 views
0

Я пытаюсь создать функцию цикла, основанную на времени. После итерации он будет печатать каждые 60 секунд «60 секунд». Но этот код приводит меня к паре «60 секунд прошло», в то время как на самом деле я смотрю даже не показываю 1 минуту. Я пробовал ниже, но я ожидаю, что он покажет мне эту информацию, но это не так (только первый пара строк итераций, после чего нет ..)using difftime для параметра цикла

Может ли кто-нибудь помочь в этом вопросе? Спасибо

#include <stdio.h> 
#include <time.h> 

int main() 
{ 
time_t start,stop; 
start = time(NULL); 
time(&start); 
int iteration, i; 
    for (iteration = 1; iteration <= 500; iteration++) { 
      for (i = 0; i <= 50; i++) { 
        printf("looping while waiting 60 second..\n"); 

      } 
      stop = time(NULL); 
      int diff = difftime(start, stop); 
      if (diff % 60 == 0) { 
        printf("60 second passed..");} 
      } 

    return 1; 
} 
+2

BTW Это пример [ожидание ожидания]] (http://en.wikipedia.org/wiki/Busy_waiting) и обычно считается плохой практикой, если его вообще можно избежать. Ваша ОС должна обеспечить способ приостановки в течение определенного времени (например, sleep (3)). – dmckee

ответ

2

difftime и следующий код, вероятно, выполняется несколько раз, прежде чем даже одна секунда прошла. В результате difftime вернет значение < 1, которое будет усечено до 0 вашим неявным литом. И, конечно, 0 % 60 == 0.

EDIT:

Вы могли бы рассмотреть что-то вроде:

start = time(NULL); 
for(; /* some condition that takes forever to meet */;) { 
    // do stuff that apparently takes forever. 
    stop = time(NULL); 
    double diff = difftime(stop, start); 
    if (diff >= 60) { 
     printf("60 seconds passed..."); 
     start = time(NULL); 
    } 
} 

отметить также, что в вашем примере кода start и stop должны быть перевернуты в вызове difftime.

+0

благодарим вас за это замечание. Я попытался изменить его, чтобы удвоить, но на самом деле% может сравнивать только целое число (отсюда та же проблема, что и выше .. или?) – xambo

+1

Проблема не в том, что ее принуждают к 'int', это значит, что тест происходит несколько раз в секунду. Таким образом, если этот код на самом деле длился более минуты (что я очень сомневаюсь), каждый раз, когда он набирал минутную отметку (включая 0), она несколько раз выдавала сообщение. – jpm

+0

Позже я изменю «итерацию» на большое число. пока мне просто нужно получить основную идею о том, как долго работает функция, прежде чем делать что-то еще (без сна) – xambo

2

Весьма вероятно, что difftime равно 0. Если вы хотите ждать в течение 60 секунд, вы должны рассмотреть возможность использования функции:

  • usleep на Linux
  • sleep на окнах
+0

Гомулка: да, я знаю о сне(). но дело в том, что я должен сделать некоторые вещи позже с номером i, что может вызвать проблемы со сном. Короче говоря, мне просто нужно распечатать что-то каждые 60 секунд, и изменить параметр цикла. Я думал, что с difftime поможет. нет? – xambo

+1

Хорошо, я этого не знал. Если изменение условия на 'diff> 0 && diff% 60 == 0' вам не поможет, я не знаю ответа на эту проблему; /. –

Смежные вопросы