C ++プログラムに時限遅延をどのように追加しますか?


94

私はC ++プログラムに時限遅延を追加しようとしていますが、私が試すことができることや私が見ることができる情報について誰かが何か提案があるかどうか疑問に思っていましたか?

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


2
これは、使用可能なプラットフォーム(OS)とライブラリによって異なります。
スコットランガム

回答:


79

Win32:Sleep(milliseconds)あなたが何であるか

unix:usleep(microseconds)あなたが望むものです。

sleep()は数秒しかかからないため、長すぎることがよくあります。


3
usleep()で十分な解像度が得られない場合は、nanosleep()もあります。
クリストファージョンソン

9
これらの関数の引数は最小スリープ時間であり、その時点で別のプロセスがCPUを占有している場合にすぐに戻ることを保証するものではないことに注意してください。
billjamesdev 2008年

1
@Richard Harrison:sleep()を機能させるためにどのヘッダーを含める必要がありますか?
オーバーフロー

12
win32 Sleep()の@Overflowhはwindows.hにあります; unistd.hのunixsleep()
リチャードハリソン

1
@TommasoTheaCioniわかりました、「プログラムを正確に遅延して再起動させるにはどうすればよいですか?」という意味だと思いますが、答えは...できません。あなたはその程度までオペレーティングシステムを制御していません。他のプログラムが重要なセグメントの途中にある場合、プログラムはただ待つ必要があります。
billjamesdev 2018年

137

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));
}

これらの機能によって、継続的に、より良い解決のための新たな機能を追加する必要はもうありません:sleepusleepnanosleep、などsleep_forsleep_untilを経由して任意の解像度の値を受け入れることができ、テンプレート機能しているchronoタイプ。時間、秒、フェムト秒など。

++ 14 Cでは、更なるのリテラル接尾辞のコードを簡素化することができます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ナノ秒のスリープを要求できますが、実装が可能な最短の場合、代わりに1ミリ秒のスリープになる可能性があります。


4
ユーザー定義のリテラルサフィックス。彼らは掘った...深すぎる。
CiroSantilli郝海东冠事病六四事件法轮功

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

これも3秒間スリープします。ただし、数値をもう少し洗練することができます。


ありがとうございました!シンプルでクリーンなソリューション。G ++ VSCodeでコンパイルするMacで動作しました。
Z41N

18

あなたはのような単純なものが欲しいですか

sleep(3);

そうすべき。それはほぼ普遍的です。どの言語/コンパイラで試しましたか?必要なライブラリをすべてインポートしましたか?
JJ

4
なぜそれが回答としてマークされなかったのか、あまり賛成されなかったのか理解できませんでした
ImranNaqvi

8

これは、スレッドがスリープする時間がスリープ期間に近いことを保証するものではなく、スレッドが実行を継続するまでの時間が少なくとも必要な時間になることを保証するだけであることに注意してください。実際の遅延は状況(特に問題のマシンの負荷)によって異なり、目的のスリープ時間よりも桁違いに長くなる可能性があります。

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


4

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

#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));
}

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);
}

`


3

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

いくつかの追加情報:http
//www.opengroup.org/onlinepubs/000095399/functions/sleep.html


3

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

例えば:

#include <chrono>

using namespace std;

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

寝る前に必ずアンダースコアを含めてください。


この機能は、新しいライブラリまたはオペレーティングシステムの機能に取って代わられました。代わりにSleepの使用を検討してください。
ByWaleed

3

cppでの出力を一定時間遅らせるには、Sleep()関数のwindows.hヘッダーファイル構文をSleep(time_in_ms)としてインクルードすることにより、Sleep()関数を使用できます。

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

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


2

ここでの一番の答えはOSに依存する答えのようです。より移植性の高いソリューションの場合は、ctimeヘッダーファイルを使用してクイックスリープ関数を作成できます(ただし、これは私の側では不十分な実装である可能性があります)。

#include <iostream>
#include <ctime>

using namespace std;

void sleep(float seconds){
    clock_t startClock = clock();
    float secondsAhead = seconds * CLOCKS_PER_SEC;
    // do nothing until the elapsed time has passed.
    while(clock() < startClock+secondsAhead);
    return;
}
int main(){

    cout << "Next string coming up in one second!" << endl;
    sleep(1.0);
    cout << "Hey, what did I miss?" << endl;

    return 0;
}

0

構文:

ボイドスリープ(符号なし秒);

sleep()は、一定の間隔(秒)の間実行を一時停止します。sleepを呼び出すと、現在のプログラムは引数secondsで指定された秒数の間実行が一時停止されます。間隔は、100分の1秒単位またはオペレーティングシステムのクロックの精度のいずれか低い方までしか正確ではありません。


0

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

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

これを実行しようとしているOSはわかりませんが、スレッド化と同期については、Boost Threadingライブラリ(Boost Condition Varriable)を参照できます。

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


0

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.