2012-05-29 4 views
3

Как загрузить цикл каждые 10 секунд и добавить +1 к счету и распечатать его?Петля каждые 10 секунд

нравится:

int count; 
    while(true) 
    { 
     count +=1; 
     cout << count << endl; // print every 10 second 
    } 

печати:

1 
2 
3 
4 
5 
ect... 

я не знаю, как, пожалуйста, помогите мне, ребята

+0

Посмотрите на функцию сна. –

+0

Насколько вам это необходимо? Если зернистость составляет секунды, 'sleep' - ваш ответ. Если вам нужна большая степень детализации, вам нужно будет искать другие решения. –

ответ

7

Моя попытка. (Почти) отлично POSIX. Работает как с POSIX, так и с MSVC/Win32.

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

const int NUM_SECONDS = 10; 

int main() 
{ 
    int count = 1; 

    double time_counter = 0; 

    clock_t this_time = clock(); 
    clock_t last_time = this_time; 

    printf("Gran = %ld\n", NUM_SECONDS * CLOCKS_PER_SEC); 

    while(true) 
    { 
     this_time = clock(); 

     time_counter += (double)(this_time - last_time); 

     last_time = this_time; 

     if(time_counter > (double)(NUM_SECONDS * CLOCKS_PER_SEC)) 
     { 
      time_counter -= (double)(NUM_SECONDS * CLOCKS_PER_SEC); 
      printf("%d\n", count); 
      count++; 
     } 

     printf("DebugTime = %f\n", time_counter); 
    } 

    return 0; 
} 

Таким образом, вы также можете иметь контроль на каждой итерации, в отличие от сна() - подход, основанный.

Это решение (или то же, что основано на высокоточном таймере) также гарантирует отсутствие накопления ошибок во времени.

EDIT: OSX вещи, если все остальное не

#include <unistd.h> 
#include <stdio.h> 

const int NUM_SECONDS = 10; 

int main() 
{ 
    int i; 
    int count = 1; 
    for(;;) 
    { 
     // delay for 10 seconds 
     for(i = 0 ; i < NUM_SECONDS ; i++) { usleep(1000 * 1000); } 
     // print 
     printf("%d\n", count++); 
    } 
    return 0; 
} 
+0

Попробуйте изменить time_t на clock_t. Кстати, «ничего» означает «он даже не компилируется»? Или это работает не так, как ожидалось? –

+0

его просто ничего не печатал – user1417815

+0

Я изменил типы на 'clock_t'. Это лучшее, что я могу сделать, не включив мой Mac. –

1

Используйте sleep(): http://www.gnu.org/software/libc/manual/html_node/Sleeping.html

int count = 0; 
while(true) 
{ 
    count++; 

    cout << count << endl; // print every 10 second 
    sleep(10); 

} 
+3

-1 для int count; так что счет может быть любым. Ваш std :: cout << count напечатает некоторый мусор, который увеличен на единицу. – ScarletAmaranth

+0

работает со сном для окон? Я думаю, что это просто linux syscall – WindowsMaker

+1

@zaftcoAgeiha: [работает в Windows] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms686298 (v = vs.85) .aspx), просто a _slightly_ другое имя и тип параметра. –

3

В WindowsВы можете использовать Sleep из windows.h:

#include <iostream> 
#include <windows.h> 


int _tmain(int argc, _TCHAR* argv[]) 
{ 
    int count = 0; 
    while(true) 
    { 
     count +=1; 
     std::cout << count << std::endl; 
     Sleep(10000); 
    } 
} 
+0

the count dont work – user1417815

+0

Не могли бы вы дать больше информации об этом? Он работает для меня, VC++ 2008. –

1

Как уже говорили другие, вы хотите функцию сна(). Однако кросс-платформенные проблемы могут возникнуть. Я нашел this thread об этой проблеме, на которую вы можете посмотреть.

1

Вот еще один пример использования Windows, Waitable Timer. Короткая цитата из MSDN страницы:

waitable таймер объект является объектом синхронизации, состояние которого установлено в сигнальное, когда наступит указанный срок. Существует два типа настраиваемых таймеров: ручной сброс и синхронизация. Таймер любого типа также может быть периодическим таймером .

Пример:

#include <Windows.h> 
#include <iostream> 

void main(int argc, char** argv) 
{ 
    HANDLE hTimer = NULL; 
    LARGE_INTEGER liTimeout; 

    // Set timeout to 10 seconds 
    liTimeout.QuadPart = -100000000LL; 

    // Creating a Waitable Timer 
    hTimer = CreateWaitableTimer(NULL, 
           TRUE,    // Manual-reset 
           "Ten-Sec Timer" // Timer's name 
           ); 
    if (NULL == hTimer) 
    { 
     std::cout << "CreateWaitableTimer failed: " << GetLastError() << std::endl; 
     return; 
    } 

    // Initial setting a timer 
    if (!SetWaitableTimer(hTimer, &liTimeout, 0, NULL, NULL, 0)) 
    { 
     std::cout << "SetWaitableTimer failed: " << GetLastError() << std::endl; 
     return; 
    } 

    std::cout << "Starting 10 seconds loop" << std::endl; 

    INT16 count = 0; 
    while (count < SHRT_MAX) 
    { 
     // Wait for a timer 
     if (WaitForSingleObject(hTimer, INFINITE) != WAIT_OBJECT_0) 
     { 
      std::cout << "WaitForSingleObject failed: " << GetLastError() << std::endl; 
      return; 
     } 
     else 
     { 
      // Here your code goes 
      std::cout << count++ << std::endl; 
     } 

     // Set a timer again 
     if (!SetWaitableTimer(hTimer, &liTimeout, 0, NULL, NULL, 0)) 
     { 
      std::cout << "SetWaitableTimer failed: " << GetLastError() << std::endl; 
      return; 
     } 
    } 
} 

Кроме того, вы можете использовать Waitable Таймер с Asynchronous Procedure Call. См. Пример this на MSDN.