0

dowhileループで実行されるwhileループがあります。whileループを毎秒正確に実行する必要があります。速くも遅くもありません。しかし、私はそれをどのように行うのかわかりません。これはループであり、独自の機能でオフになっています。sleep()関数について聞いたことがありますが、あまり正確ではないとも聞いています。

int min5()
{
    int second = 00;
    int minute = 0;
    const int ZERO = 00;

    do{
        while (second <= 59){
        if(minute == 5) break;
        second += 1;
        if(second == 60) minute += 1;
        if(second == 60) second = ZERO;
        if(second < 60) cout << "Current Time> "<< minute <<" : "<< second <<" \n";
        }
      } while (minute <= 5);
}
4

5 に答える 5

4

達成できる最高の精度は、オペレーティングシステム(OS)機能を使用することです。コールバック関数もあるAPIを見つける必要があります。コールバック関数は、タイマーの期限が切れたときにOSが呼び出す関数です。

プログラムの実行中に実行されている他のタスクやアクティビティが原因で、OSのタイミング精度が失われる可能性があることに注意してください。

于 2010-05-04T18:57:26.407 に答える
3

ポータブルなソリューションが必要な場合は、高精度のタイミングを期待するべきではありません。通常、これはプラットフォームに依存するソリューションでのみ得られます。

ポータブル(CPU効率があまり高くなく、特に洗練されていませんが)ソリューションは、次のような関数を使用する場合があります。

#include <ctime>

void wait_until_next_second()
{
    time_t before = time(0);
    while (difftime(time(0), before) < 1);
}

次に、次のように関数でこれを使用します。

int min5()
{
    wait_until_next_second();  // synchronization (optional), so that the first
                               // subsequent call will not take less than 1 sec.
    ...
    do
    {
        wait_until_next_second();  // waits approx. one second
        while (...)
        {
            ...
        }
    } while (...)
}

あなたのコードに関するいくつかのさらなるコメント:

  • minute値5に達すると、コードは無限ループに入ります。

  • これは8進数(基数8)の数値(先行ゼロによる)を00示していることをご存知ですか?この場合は問題ありませんが、などの数字には注意してください。これは10進数の15であり、17ではありません。017

  • ループの状態にseconds++権利を組み込むことができます。whilewhile (seconds++ <= 59) ...

  • endlこの場合、ストリームに挿入するとフラッシュされますが、挿入してもcoutストリームはフラッシュされないため、ストリームに挿入する方がよいと思い"\n"ます。ここではそれほど重要ではありませんが、あなたの意図は常に現在の時刻を確認することであるようcoutです。ストリームをフラッシュしない場合、実際にタイムメッセージがすぐに表示される保証はありません。

于 2010-05-04T19:09:15.503 に答える
1

たとえば、Windowsでは、待機可能なタイマーオブジェクトを作成する可能性があります。

それがご使用のオペレーティングシステムである場合は、ここのドキュメント(たとえば、待機可能なタイマーオブジェクト)を確認してください。

あなたが提示したコードから、あなたがやろうとしていることは睡眠ではるかに簡単にできるように見えます。ループ本体が正確に1秒ごとに実行されることを保証することは意味がありません。代わりに、1秒間に10回実行し、前回の「アクションを実行しました」から経過した時間が1秒を超えているかどうかを確認します。そうでない場合は、何もしません。はいの場合、アクションを実行し(メッセージを出力し、変数をインクリメントするなど)、最後のアクションの時間を保存して、再度ループします。

于 2010-05-04T19:04:51.240 に答える
1

他の誰かが投稿したように、あなたのOSはある種のアラームまたはタイマー機能を提供するかもしれません。独自のポーリングループをコーディングするのではなく、この種のものを使用するようにしてください。時間をポーリングするということは、毎秒コンテキストを切り替える必要があることを意味します。これにより、システムが他の処理を実行しているときにコードを実行し続けることができます。この場合、「もう終わった」と言うだけで、他の誰かに300回割り込みます。

また、スリープの持続時間については絶対に想定しないでください。リアルタイムOSを使用している場合でも、これは安全ではありません。エラーが蓄積されるため、毎回リアルタイムクロックまたはティックカウンターに経過時間を確認する必要があります。そのため、時間の経過とともに精度が低下します。これは、リアルタイムシステムでも当てはまります。リアルタイムシステムが1秒間正確にスリープできたとしても、コードの実行には時間がかかるため、このタイミングエラーはループを通過するたびに蓄積されます。

于 2010-05-04T19:08:32.573 に答える
0
Sleep(1000);

http://msdn.microsoft.com/en-us/library/ms686298(VS.85).aspx

于 2010-05-04T18:55:53.930 に答える