Замедление вывода 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();
Какой бы системой вы ни пользовались, она будет иметь какую-то функцию сна, которую вы можете вызвать, которая приостановит вашу программу на определенный период времени. Вы не указываете, какую операционную систему вы используете, поэтому я не могу дать точные детали, но это похоже на подход, который вы ищете.
Если после рисования каждого обновления изображения вы вызываете режим сна в течение определенного промежутка времени, ваша программа будет находиться в режиме ожидания в течение этого времени, прежде чем возобновлять и создавать следующее обновление. Это должно дать вам шанс увидеть изменения
Если вы хотите спать с более высоким разрешением, вы можете посмотреть на 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){};