私はC ++プログラムに時限遅延を追加しようとしていますが、私が試すことができることや私が見ることができる情報について誰かが何か提案があるかどうか疑問に思っていましたか?
この時限遅延をどのように実装するかについてもっと詳しく知りたいのですが、時限遅延を追加する方法についてもっと情報が得られるまで、これをどのように実装しようとすればよいかわかりません。
回答:
Win32:Sleep(milliseconds)
あなたが何であるか
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
、などsleep_for
とsleep_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ミリ秒のスリープになる可能性があります。
あなたはのような単純なものが欲しいですか
sleep(3);
このコードスニペットを試すことができます:
#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));
}
マイクロ秒の精度が必要な場合は、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);
}
`
はい、睡眠はおそらくここで選択する機能です。関数に渡される時間は、呼び出し元のスレッドが非アクティブになる最小の時間であることに注意してください。したがって、たとえば5秒でsleepを呼び出すと、スレッドが少なくとも5秒間スリープすることが保証されます。OSの動作に応じて、6、8、または50になります。(最適なOS実行中、これは5に非常に近くなります。)
スリープ関数のもう1つの便利な機能は、0を渡すことです。これにより、スレッドからコンテキストスイッチが強制されます。
いくつかの追加情報:http:
//www.opengroup.org/onlinepubs/000095399/functions/sleep.html
ライブラリ"_sleep(milliseconds);"
を含めると、(引用符なしで)Win32でうまく機能することがわかりましたchrono
例えば:
#include <chrono>
using namespace std;
main
{
cout << "text" << endl;
_sleep(10000); // pauses for 10 seconds
}
寝る前に必ずアンダースコアを含めてください。
cppでの出力を一定時間遅らせるには、Sleep()関数のwindows.hヘッダーファイル構文をSleep(time_in_ms)としてインクルードすることにより、Sleep()関数を使用できます。
cout<<"Apple\n";
Sleep(3000);
cout<<"Mango";
出力。上記のコードはAppleを印刷し、3秒待ってからMangoを印刷します。
ここでの一番の答えは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;
}
他の多くの人が睡眠のための良い情報を提供しています。私は、睡眠が最も適切な解決策になることはめったにないというウェッジに同意します。
何かを待っているときに眠っている場合は、実際にそのこと/イベントを待っている方がよいでしょう。これについては条件変数を見てください。
これを実行しようとしているOSはわかりませんが、スレッド化と同期については、Boost Threadingライブラリ(Boost Condition Varriable)を参照できます。
非常に短い期間を待とうとしている場合は、もう一方の極端に移動すると、ハックスタイルのオプションがいくつかあります。'sleep'が実装されていないある種の組み込みプラットフォームで作業している場合は、本体が空の単純なループ(for / whileなど)を試すことができます(コンパイラーが最適化しないように注意してください)。もちろん、この場合の待機時間は特定のハードウェアによって異なります。本当に短い「待機」の場合は、アセンブリ「nop」を試すことができます。これらがあなたが求めているものであるかどうかは非常に疑わしいですが、なぜ待つ必要があるのかわからないので、より具体的にするのは難しいです。
Windowsでは、Windowsライブラリを含めて、「Sleep(0);」を使用できます。プログラムをスリープ状態にします。ミリ秒を表す値を取ります。