ミリ秒間スリープ


632

私は、POSIX sleep(x)関数がプログラムをx秒間スリープさせることを知っています。C ++でプログラムをx ミリ秒間スリープさせる関数はありますか?


7
あなたはとにかくWindowsで、ことに注意する必要がありSleep()、ミリ秒持っ精度を、それの精度は大きさ以上の注文することができます。あなたは、4ミリ秒のためにあなたの睡眠をと思うが、実際には400のために睡眠も
ジョンDibling

5
@John Dibling:彼は"x秒"が与えられたsleepwin32ではなく、POSIXを使用していると思いますSleep
CBベイリー

1
CとC ++では名前の変換が異なるため、バグや非互換性の原因となる可能性がありますが、ほとんどの場合、C ++でCヘッダーを使用すると問題ありません。ただし、何も問題がないことを確実にしたい場合は#includeextern "C" {}ブロック内のCヘッダーを使用します。また、CとC ++のソースファイルが同じプロジェクトにある場合は、特に両方の種類のソースファイルに同じヘッダーを含める場合(これが必要な場合)に問題を回避するために、これを行うことを強くお勧めします。 。純粋にC ++プロジェクトがある場合、まったく問題なく動作する可能性があります。
adam10603 2015年

2
@JohnDiblingいいえ、400msではありません。これまで得られた中で最悪の精度は、GetTickCount55msの解像度を持つWindows 9xからのものでした。それ以降のバージョンは16ms以下の解像度でした。あるユーザーは、スリープから16msの解像度を取得していると思っていましたがSleepそれ自体はかなり正確であり、GetTickCount時間の経過を測定するためにを使用したことが原因であると報告しています。
Qwertie

回答:


457

ミリ秒の標準C APIはないため、(Unixでは)usleepマイクロ秒を受け入れるで解決する必要があることに注意してください。

#include <unistd.h>

unsigned int microseconds;
...
usleep(microseconds);

2
忙しい睡眠ですか?睡眠中に別のスレッドに譲る必要があります。usleepそのために使用できますか?
マイケル

13
これはビジーな待機ではないstackoverflow.com/a/8156644/1206499であり、廃止されたnanosleepため、より適切な選択である可能性がありますusleep
jswetzen

4
ニート、C ++ 11コンパイラを使用している場合は移植性が高い@ HighCommander4の回答について言及することを検討してください。
einpoklum 2016年

6
usleep()2008年2001年にPOSIXで非推奨と除去
ジェットスキーS型

1270

C ++ 11では、これを標準ライブラリ機能で行うことができます。

#include <chrono>
#include <thread>
std::this_thread::sleep_for(std::chrono::milliseconds(x));

明確で読みやすく、sleep()関数が取る単位を推測する必要はもうありません。


6
std :: this_thread :: sleep_forは中断ポイントを定義していますか?boost :: this_thread_sleepのように?
Martin Meeser 2013

73
これが正しい方法です。限目。スレッドはクロノと同様にクロスプラットフォームです。
Voidの

88
@Void。確かに非常に良い方法ですが、「the」と「period」は非常に強い言葉です。
Mad Physicist

5
忙しい睡眠ですか?睡眠中に別のスレッドに譲る必要があります。sleep_forそのために使用できますか?
マイケル

14
@Michael:それは忙しい睡眠ではなく、他のスレッドに譲ります。
HighCommander4 2015年

83

移植性を維持するには、Boost :: Threadをスリープに使用できます。

#include <boost/thread/thread.hpp>

int main()
{
    //waits 2 seconds
    boost::this_thread::sleep( boost::posix_time::seconds(1) );
    boost::this_thread::sleep( boost::posix_time::milliseconds(1000) );

    return 0;
}

この回答は重複しており、以前にこの質問に投稿されています。おそらくそこにもいくつかの有用な答えを見つけることができます。


6
マルチスレッド環境でboost::this_thread::sleepは、コードに中断ポイントが追加されることに注意してください。boost.org/doc/libs/1_49_0/doc/html/thread/...
マーティンMeeser

35

Unixでは、usleepを使用できます。

WindowsにはSleepがあります。


4
Windowsの呼び出しはミリ秒単位です。
shindigo 2013

17
<unistd.h>または<Windows.h>をそれぞれ含める必要があります。
gbmhunter 2014年

はい、しかし実際の時間分解能は15〜16ミリ秒(通話の単位が1ミリ秒であっても)でなかったため、最小時間は15〜16ミリ秒になりませんか。
Peter Mortensen

33

お使いのプラットフォームに応じてusleepnanosleep利用可能または利用可能です。usleep廃止され、最新のPOSIX標準から削除されました。nanosleep推奨されます。


6
usleep()がで宣言されている間<unistd.h>、紛らわしいことnanosleep()<time.h>/ で宣言されてい<ctime>ます。
gbmhunter 2014年

27

なぜtime.hライブラリを使用しないのですか?WindowsおよびPOSIXシステムで実行します。

#include <iostream>
#include <time.h>

using namespace std;

void sleepcp(int milliseconds);

void sleepcp(int milliseconds) // Cross-platform sleep function
{
    clock_t time_end;
    time_end = clock() + milliseconds * CLOCKS_PER_SEC/1000;
    while (clock() < time_end)
    {
    }
}
int main()
{
    cout << "Hi! At the count to 3, I'll die! :)" << endl;
    sleepcp(3000);
    cout << "urrrrggghhhh!" << endl;
}

修正されたコード-CPUがIDLE状態のままになる[2014.05.24]:

#include <iostream>
#ifdef _WIN32
    #include <windows.h>
#else
    #include <unistd.h>
#endif // _WIN32

using namespace std;

void sleepcp(int milliseconds);

void sleepcp(int milliseconds) // Cross-platform sleep function
{
    #ifdef _WIN32
        Sleep(milliseconds);
    #else
        usleep(milliseconds * 1000);
    #endif // _WIN32
}
int main()
{
    cout << "Hi! At the count to 3, I'll die! :)" << endl;
    sleepcp(3000);
    cout << "urrrrggghhhh!" << endl;
}

24
このコードの問題の1つは、ビジーループであり、シングルプロセッサコアを100%使用し続けることです。スリープ関数は、現在のスレッドをスリープさせて他のことを行うOS呼び出しを中心に実装され、指定された時間が経過したときにのみスレッドを起動します。
Ismael

その通りです-1つのCPUコアの100%を消費します。そこでここでは、システムのスリープ機能を使用してコードを書き換えている-そしてそれはまだクロスプラットフォームです:
バートGrzybicki

@BartGrzybicki私はこれが古い答えであることを知っていますが、WindowsマシンのVisual Studio 2017では、#ifdef WIN32デフォルトでtrueと評価されません。
kayleeFrye_onDeck

2
@kayleeFrye_onDeckコードが間違っています。それはあるはずです#ifdef _WIN32
Contango、

1
@Contango知っていました!しかし、私が書いたときではありません...笑。フォローアップありがとうございます!
kayleeFrye_onDeck

17

nanosleepより良い選択ですusleep-割り込みに対してより回復力があります。


6
私は知っていましたがusleep、知りませんでしたnanosleep。Linuxでの使用例を提供する必要があります。
jww 2016

14
#include <windows.h>

構文:

Sleep (  __in DWORD dwMilliseconds   );

使用法:

Sleep (1000); //Sleeps for 1000 ms or 1 sec

3
これには何を含める必要がありますか?
ʇolɐǝzǝɥʇ前期比

#include <WinBase.h>
foob​​ar 2014年

7
いいえ、あなたがする必要があり#include <windows.h>
ʇolɐǝzǝɥʇ前期比

7
この質問は、POSIXソリューションが必要であることを強く示唆しています。
Toby Speight 2017

7

MS Visual C ++ 10.0を使用している場合は、標準のライブラリ機能でこれを行うことができます。

Concurrency::wait(milliseconds);

必要になるだろう:

#include <concrt.h>

10
「標準」という言葉を実際に意味しない場合は使用しないでください。 標準ライブラリのヘッダーで<concrt.h>はありません -プラットフォームライブラリの可能性があります。その場合、前提条件を明確に示す必要があります。
Toby Speight 2017

5

select関数を備えたプラットフォーム(POSIX、Linux、およびWindows)では、次のことができます。

void sleep(unsigned long msec) {
    timeval delay = {msec / 1000, msec % 1000 * 1000};
    int rc = ::select(0, NULL, NULL, NULL, &delay);
    if(-1 == rc) {
        // Handle signals by continuing to sleep or return immediately.
    }
}

ただし、現在利用できるより良い代替案があります。


WindowsマシンのVS2017でコンパイルできないようです:error LNK2019: unresolved external symbol _select@20 referenced in function "void __cdecl sleep(unsigned long)" (?sleep@@YAXK@Z)
kayleeFrye_onDeck

@kayleeFrye_onDeckコンパイルします。リンクしません。Windowsドキュメントを検索します。
Maxim Egorushkin

timevalにはどのヘッダーを使用しますか?
Totte Karlsson

@TotteKarlsson <sys/time.h>
Maxim Egorushkin

4

C ++でプログラムをスリープさせるSleep(int)方法はメソッドです。それのヘッダーファイルは#include "windows.h."

例えば:

#include "stdafx.h"
#include "windows.h"
#include "iostream"
using namespace std;

int main()
{
    int x = 6000;
    Sleep(x);
    cout << "6 seconds have passed" << endl;
    return 0;
}

スリープ時間はミリ秒単位で測定され、制限はありません。

Second = 1000 milliseconds
Minute = 60000 milliseconds
Hour = 3600000 milliseconds

3
制限がないとはどういう意味ですか?確かに0xFFFFFFFEという制限があります。0xFFFFFFFFを待機しても、タイムアウトは発生しません(つまり、プログラムが終了するまで待機します)。
イジー

誤解して申し訳ありませんが、Izzyのようなものではありませんでした。正のミリ秒数を入力できることを意味しました。そのため、プログラムを閉じるまでに数ミリ秒待機します。わからない場合はその旨お伝えください。

はい、しかしそれは実際の時間分解能とは何ですか?場合によっては15〜16ミリ秒ではないでしょうか。たとえば、Sleep(3)を使用する場合、実際には3ミリ秒スリープするのでしょうか、それとも15〜16ミリ秒でしょうか。
Peter Mortensen

3

選択呼び出しは、より正確な方法です(スリープ時間はナノ秒単位で指定できます)。


これは問題を解決するための貴重なヒントになるかもしれませんが、良い答えも解決策を示しています。意味を示すコード例を提供するように編集してください。または、代わりにコメントとしてこれを書くことを検討してください。
Toby Speight 2017

3

Boost非同期入出力スレッドを使用し、xミリ秒間スリープします。

#include <boost/thread.hpp>
#include <boost/asio.hpp>

boost::thread::sleep(boost::get_system_time() + boost::posix_time::millisec(1000));

3ミリ秒間スリープしようとすると、実際にはどうなりますか?代わりに15〜16ミリ秒になりますか?測定しましたか?
Peter Mortensen

1

質問は古いですが、私はこれを私のアプリに入れる簡単な方法を理解することができました。以下に示すように、C / C ++マクロを作成して使用できます。

#ifndef MACROS_H
#define MACROS_H

#include <unistd.h>

#define msleep(X) usleep(X * 1000)

#endif // MACROS_H

1

stdとその数値リテラルを使用するC ++ 14から:

#include <chrono>
#include <thread>

using namespace std::chrono;

std::this_thread::sleep_for(123ms);

0

POSIXシステムのWin32の代替として:

void Sleep(unsigned int milliseconds) {
    usleep(milliseconds * 1000);
}

while (1) {
    printf(".");
    Sleep((unsigned int)(1000.0f/20.0f)); // 20 fps
}

優先nanosleep()usleep():後者は廃止されており、最新のPOSIX標準から削除されました。
Toby Speight 2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.