0

スナップのゲームに基づいて、少し初心者向けの C++ プログラムを作成しています。

カード オブジェクトをコンソールに出力すると、コンピューターの処理速度の自然なため、配られたカードの完全なリストが表示されます。人間が各カードが配られるのを実際に観察できるように、各カードの配りの間に一時停止を入れることができればいいと思いました。私は常に Linux と Windows の両方で作業しており、すでに < ctime > が含まれているため、この小さな解決策を思いつきました。

for(;;){
            if( (difftime(time(0),lastDealTime)) > 0.5f){ //half second passed
                cout << currentCard <<endl;
                lastDealTime = time(0);
                break;
            }
        }

最初はうまくいったと思いましたが、後でディール プロセスをスピードアップしようとしたときに、0.5 のコントロール値を変更しても (0.5 秒ごとにカードをディールすることを目指していました)、効果がないように見えることに気付きました。 . 0.05 秒ごとに処理するように変更しようとしましたが、違いはありませんでした。

なぜこれが機能しないのかについての観察はありますか? ありがとう!

4

4 に答える 4

2

の分解能time()は 1 秒です。つまり、戻り値は整数の秒数です。1 秒未満の違いは見られません。

usleep()標準 C ライブラリにあります。マイクロ秒単位の解像度があるため、代わりにそれを使用してください。

于 2012-01-31T11:55:55.550 に答える
1

要求した間隔で正確にカードが配られるようにしたい場合は、タイマー クラスも作成する必要があります。を使用しております:

Windows では、QueryPerformanceFrequencyを使用してシステム ティック時間を取得し、QueryPerformanceCounterを使用してティックを取得します。

Mac Carbon では、DurationToAbsolute を使用してシステム ティック時間を取得し、UpTime を使用してティックを取得します。

Linux ではclock_gettimeを使用します。

睡眠用:

1 つの Windows は Sleep(); を使用します。

Mac Carbon では MPDelayUntil(); を使用します。

Linux では nanosleep(); を使用します。

于 2012-01-31T12:18:50.867 に答える
1

私が見たコードの大きな問題は、スリープのシングルプラットフォームバージョンが見つからなかったという事実ではなく、スリープが実際にCPUの処理を一定期間停止することを意図しているという事実ですが、あなたのものです処理は停止せず、アプリケーションは多くのリソースを消費します。

もちろん、コンピュータが 1 つのアプリケーションだけを実行することに専念している場合は問題にならないかもしれませんが、最近では、コンピュータが 1 つ以上のことを実行することを期待しています。

于 2012-01-31T12:37:58.023 に答える
1

time()difftime()1秒未満の間隔を管理するためにそれらを使用する方法がないため、1秒の解像度があります。1 秒間隔であっても、ジッターも最大 1 秒になる可能性があるため、使用できません。

この場合の解決策は、ヘッダー ファイルでシステムに依存しないインターフェイスを使用して、ある種のタイマー クラスを定義することですが、ソース ファイルはシステムに依存します。システムに応じて、どちらかのソース ファイルをコンパイルします。Windows と Linux の両方に、より高い解像度で時間を管理する方法があります。

于 2012-01-31T11:59:54.167 に答える