Замедление вывода C++ на терминал

Я написал программу, которая имитирует игру жизни. В основном мир реализуется с помощью двумерного std::vector bool, Если bool верно, что клетка жива, если ложно, клетка мертва. Результатом программы является система на каждом временном шаге, полностью в коде ASCII:

[ ][0][ ]
[ ][ ][0]
[0][0][0]

Проблема в том, что программа работает очевидно быстро и каждый шаг печатается слишком быстро: я не вижу, как развивается система. Есть ли какая-то хитрость, чтобы замедлить вывод (или непосредственно программу)?

РЕДАКТИРОВАТЬ: я на Mac OS X 10.7. Мой компилятор - GCC 4.7.

3 ответа

Решение

Вы можете использовать стандарт C++ (C++11):

#include <thread>
#include <chrono>
#include <iostream>

int main() {
    while (true) {
        // draw loop
        std::this_thread::sleep_for(std::chrono::milliseconds(20));
    }
}

В качестве альтернативы вы можете использовать библиотеку, которая позволяет вам указать интервал для вызова вашей функции рисования. OS X имеет Grand Central Dispatch (он же libdispatch). Используя GCD, вы можете создать источник таймера диспетчеризации, который будет вызывать вашу функцию рисования с указанной частотой.

dispatch_source_t timer = dispatch_source_create(
    DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_main_queue());

dispatch_source_set_timer(timer, DISPATCH_TIME_NOW,
    duration_cast<nanoseconds>(milliseconds(20)).count(),
    duration_cast<nanoseconds>(milliseconds( 5)).count());
// the API is defined to use nanoseconds, but I'd rather work in milliseconds
// so I use std::chrono to do the conversion above

dispatch_source_set_event_handler(timer,
    []{ your_draw_function(); });
// I'm not sure if GCC 4.7 actually supports converting C++11 lambdas to
// Apple's C blocks, or if it even supports blocks. Clang supports this.

dispatch_resume(timer);

dispatch_main();

ссылка на libdispatch

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

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

Если вы хотите спать с более высоким разрешением, вы можете посмотреть на nanosleep а также usleep

1.Вы можете использовать

int tmp; std::cin >> tmp;

и программа попросит вас, прежде чем идти дальше.

2. Вы можете использовать цикл над некоторыми вычислениями. подобно

double Tmp[1000000];
for( int i = 0; i < 1000000; i++ )
  Tmp[i] = i;
for( int i = 0; i < 1000000; i++ )
  Tmp[i] = sin(sin(sin(Tmp[i])));

3.Вы можете проверить, какие функции задержки у вас есть. Пример "Sleep(nSeconds)" здесь

4.Вы можете сохранить и проверить свое системное время. Подобно:

 while (time() < time_end){};
Другие вопросы по тегам