C++ プログラムに時間指定の遅延を追加するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/158585

  •  03-07-2019
  •  | 
  •  

質問

C++ プログラムに時間指定の遅延を追加しようとしていますが、試してみることができる提案や参照できる情報を持っている人がいるかどうか疑問に思っています。

この時間遅延を実装する方法についてもっと詳しく知りたいのですが、時間遅延を追加する方法についての詳細情報が得られるまで、これをどのように実装すればよいのかわかりません。

役に立ちましたか?

解決

Win32: スリープ(ミリ秒) はあなたが何をするか

unix: usleep(microseconds) はあなたのものです

sleep()には数秒しかかからず、多くの場合長すぎます。

他のヒント

C ++ 11の更新された回答:

sleep_for および sleep_until 関数を使用します。

#include <chrono>
#include <thread>

int main() {
    using namespace std::this_thread; // sleep_for, sleep_until
    using namespace std::chrono; // nanoseconds, system_clock, seconds

    sleep_for(nanoseconds(10));
    sleep_until(system_clock::now() + seconds(1));
}

これらの関数を使用すると、 sleep usleep nanosleep など、解像度を向上させるために新しい関数を継続的に追加する必要がなくなります。< code> sleep_for および sleep_until は、 chrono 型を介して任意の解像度の値を受け入れることができるテンプレート関数です。時間、秒、フェムト秒など。

C ++ 14では、 nanoseconds および seconds のリテラルサフィックスを使用してコードをさらに簡素化できます。

#include <chrono>
#include <thread>

int main() {
    using namespace std::this_thread;     // sleep_for, sleep_until
    using namespace std::chrono_literals; // ns, us, ms, s, h, etc.
    using std::chrono::system_clock;

    sleep_for(10ns);
    sleep_until(system_clock::now() + 1s);
}

実際のスリープ時間は実装に依存することに注意してください:10ナノ秒スリープするように要求できますが、実装が可能な限り短い場合、代わりにミリ秒スリープする可能性があります。

#include <unistd.h>
usleep(3000000);

これも3秒間スリープします。ただし、数値をもう少し絞り込むことができます。

次のような単純なものが必要ですか

sleep(3);

これは、スレッドがスリープする時間の長さがスリープ期間に近いことを保証するものではなく、スレッドが実行を継続するまでの時間が少なくとも望ましい量になることのみを保証することに注意してください。実際の遅延は、状況(特に問題のマシンの負荷)に応じて異なり、希望のスリープ時間よりも桁違いに大きい場合があります。

また、スリープする必要がある理由はリストしませんが、一般的に同期の方法として遅延を使用することは避けてください。

マイクロ秒の精度が必要な場合は、select(2)を使用することもできます(これはusleep(3)がないプラットフォームで動作します)

次のコードは1.5秒待機します:

#include <sys/select.h>
#include <sys/time.h>
#include <unistd.h>`

int main() {
    struct timeval t;
    t.tv_sec = 1;
    t.tv_usec = 500000;
    select(0, NULL, NULL, NULL, &t);
}

`

&quot; _sleep(milliseconds);&quot; (引用符なし)は、 chrono ライブラリを含めるとWin32でうまく機能することがわかりました

例:

#include <chrono>

using namespace std;

main
{
    cout << "text" << endl;
    _sleep(10000); // pauses for 10 seconds
}

スリープする前にアンダースコアを含めるようにしてください。

はい、おそらく睡眠はここで選択する機能です。関数に渡される時間は、呼び出しスレッドが非アクティブになる最小時間であることに注意してください。したがって、たとえば、5秒でsleepを呼び出すと、スレッドが少なくとも5秒間スリープすることが保証されます。 OSの動作に応じて、6、8、または50になります。 (最適なOS実行中、これは5に非常に近くなります。)
スリープ機能のもう1つの便利な機能は、0を渡すことです。これにより、スレッドからコンテキスト切り替えが強制されます。

追加情報:
http://www.opengroup.org/onlinepubs/000095399/functions/sleep。 html

次のコードスニペットを試すことができます:

#include<chrono>
#include<thread>

int main(){
    std::this_thread::sleep_for(std::chrono::nanoseconds(10));
    std::this_thread::sleep_until(std::chrono::system_clock::now() + std::chrono::seconds(1));
}

cppの出力を固定時間遅延させるには、windows.hヘッダーファイルを含めることでSleep()関数を使用できます。 Sleep()関数の構文はSleep(time_in_ms)です as

cout<<"Apple\n";
Sleep(3000);
cout<<"Mango";

出力。上記のコードはAppleを印刷し、3秒間待ってからMangoを印刷します。

構文:

void sleep(unsigned seconds);

sleep()は、間隔(秒)の間、実行を一時停止します。 sleepを呼び出すと、引数secondsで指定された秒数の間、現在のプログラムの実行が中断されます。間隔の精度は、最も近い100分の1秒またはオペレーティングシステムクロックの精度のうち、どちらか低い方のみです。

他の多くの人が睡眠に役立つ情報を提供しています。睡眠が最も適切な解決策になることはめったにないというウェッジの意見に私も同意します。

何かを待っているときに眠っている場合は、実際にそのことやイベントを待った方が良いでしょう。これについては、「条件変数」を参照してください。

どの OS でこれを実行しようとしているのかわかりませんが、スレッドと同期については、 ブーストスレッディング ライブラリ (ブースト条件変数).

ここで、もう一方の極端な話に移ります。非常に短い期間待機したい場合は、ハック スタイルのオプションがいくつかあります。「スリープ」が実装されていないある種の組み込みプラットフォームで作業している場合は、空の本体で単純なループ (for/while など) を試すことができます (コンパイラーが最適化を行わないように注意してください)。もちろん、この場合の待ち時間は特定のハードウェアによって異なります。本当に短い「待ち時間」の場合は、アセンブリを「nop」してみることができます。これらがあなたが望んでいることであるとは非常に疑わしいですが、なぜ待つ必要があるのか​​がわからないと、より具体的にするのは困難です。

Windowsでは、Windowsライブラリを含めて&quot; Sleep(0);&quot;を使用できます。プログラムをスリープ状態にします。ミリ秒を表す値を取ります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top