2

人生ゲームをシミュレートするプログラムを書きました。基本的に、世界は の 2 次元 std::vector によって実装されboolます。が true の場合bool、セルは生きており、 false の場合、セルは死んでいます。プログラムの出力は、タイム ステップごとのシステムであり、完全に ASCII コードです。

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

問題は、プログラムの実行速度が明らかに速く、各ステップの出力が速すぎることです。システムがどのように進化するかわかりません。出力を遅くする(またはプログラムを直接)するためのトリックはありますか?

編集:私はMac OS X 10.7を使用しています。私のコンパイラは GCC 4.7 です。

4

3 に答える 3

2

標準 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 リファレンス

于 2012-08-22T18:39:44.713 に答える
1

使用しているシステムが何であれ、特定の期間プログラムを一時停止するために呼び出すことができるある種のスリープ機能があります。使用しているOSを指定していないため、正確な詳細を説明することはできませんが、探しているアプローチのように聞こえます.

画像の各更新を描画した後、特定の時間スリープを呼び出すと、プログラムは次の更新を再開して描画する前に、その時間だけスリープします。これにより、実際に変更を確認する機会が得られるはずです

より高い解像度の時間睡眠が必要な場合は、次を見てnanosleepusleep

于 2012-08-22T17:13:10.540 に答える
0

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){};
于 2012-08-22T17:30:46.283 に答える