睡眠毫秒

Pra*_*van 577 c++ linux sleep

我知道POSIX sleep(x)函数使程序休眠x秒.是否有一个函数使程序在C++中休眠x 毫秒

HC4*_*ica 1160

在C++ 11中,您可以使用标准库工具执行此操作:

#include <chrono>
#include <thread>
Run Code Online (Sandbox Code Playgroud)
std::this_thread::sleep_for(std::chrono::milliseconds(x));
Run Code Online (Sandbox Code Playgroud)

清晰可读,不再需要猜测sleep()函数采用的单位.

  • @Void.肯定是一个非常好的方式,但""和"时期"是非常强烈的话. (73认同)
  • 这是正确的方法.期.线程是跨平台的,也是时间的. (69认同)
  • @Michael:这不是一个忙碌的睡眠,它会屈服于其他线程. (12认同)
  • std :: this_thread :: sleep_for是否定义了中断点?喜欢boost :: this_thread_sleep吗? (6认同)
  • 这是一个忙碌的睡眠吗?我需要在睡眠期间屈服于另一个线程; 我能用'sleep_for`吗? (3认同)
  • 这是否可以通过信号中断? (3认同)
  • @Valen:还有其他方法可以避免这种延迟吗? (2认同)
  • 您确定在某些情况下实际最短时间不是 15-16 毫秒(即使指定了 3 毫秒)?您是否测量过它(例如使用高分辨率计时器)? (2认同)
  • @Qwertie。我的理由是,“这是正确的方法。期间”是一个绝对的陈述,暗示A)在所有情况下都存在相同的“正确”方法,并且B)没有其他方法可以做到。至少在某些情况下同样“正确”。我绝不暗示我以任何方式都找不到答案中的解决方案:“我肯定是这样描述的”。我反对使用绝对值。还有其他可能的好的解决方案,因此对我而言,暗示其他似乎不合理。 (2认同)

Nie*_*sol 440

请注意,毫秒没有标准的C API,所以(在Unix上)你必须满足usleep,这接受微秒:

#include <unistd.h>

unsigned int microseconds;
...
usleep(microseconds);
Run Code Online (Sandbox Code Playgroud)

  • 这不是一个忙碌的等待http://stackoverflow.com/a/8156644/1206499,并且`nanosleep`可能是一个更好的选择,因为'usleep`已经过时了. (11认同)
  • 这是一个忙碌的睡眠吗?我需要在睡眠期间屈服于另一个线程; 我可以用'usleep`吗? (2认同)
  • Niet,请考虑提及@ HighCommander4的答案,如果你有一个C++ 11编译器,这个答案更便携. (2认同)
  • usleep()在POSIX中于2001年弃用,并于2008年删除。 (2认同)

MOn*_*DaR 80

为了保持便携性,您可以使用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;
}
Run Code Online (Sandbox Code Playgroud)

这个答案是重复的,之前已在此问题中发布.也许你也可以找到一些有用的答案.

  • 请记住 - 在多线程环境中-`boost :: this_thread :: sleep`会为您的代码添加一个中断点.http://www.boost.org/doc/libs/1_49_0/doc/html/thread/thread_management.html (6认同)

INS*_*INS 34

在Unix中你可以使用usleep.

在Windows中有睡眠.

  • 您必须分别包含<unistd.h>或<Windows.h>. (14认同)
  • Windows调用以毫秒为单位. (4认同)

CB *_*ley 32

您可能拥有usleepnanosleep可用,具体取决于您的平台.usleep已弃用,已从最新的POSIX标准中删除; nanosleep是优选的.

  • 请注意,虽然`usleep()`在`<unistd.h>`中声明,但令人困惑的是,`nanosleep()`在`<time.h>`/`<ctime>`中声明. (4认同)

小智 21

为什么不使用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;
}
Run Code Online (Sandbox Code Playgroud)

更正代码 - 现在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;
}
Run Code Online (Sandbox Code Playgroud)

  • 该代码的一个问题是它是一个繁忙的循环,它将继续使用单个处理器核心的100%.sleep函数是围绕一个OS调用实现的,该调用将使当前线程休眠并执行其他操作,并且仅在指定的时间到期时唤醒线程. (20认同)
  • @kayleeFrye_onDeck 代码错误。它应该是“#ifdef _WIN32”。 (2认同)

Joh*_*ski 17

nanosleep是一个更好的选择usleep- 它更能抵御中断.

  • 我熟悉`usleep`,但不熟悉`nanosleep`.您应该提供在Linux上使用它的示例. (6认同)

小智 14

#include <chrono>
#include <thread>

std::this_thread::sleep_for(std::chrono::milliseconds(1000)); // sleep for 1 second
Run Code Online (Sandbox Code Playgroud)

请记住导入两个标题。

  • 这只是重复[HighCommander4的答案](/a/10613664/4850040)。您应该只支持现有的答案,而不是再次编写相同的内容。 (2认同)

foo*_*bar 13

#include <windows.h>
Run Code Online (Sandbox Code Playgroud)

句法:

Sleep (  __in DWORD dwMilliseconds   );
Run Code Online (Sandbox Code Playgroud)

用法:

Sleep (1000); //Sleeps for 1000 ms or 1 sec
Run Code Online (Sandbox Code Playgroud)

  • 不,你需要`#include <windows.h>` (7认同)
  • 这个问题强烈暗示需要POSIX解决方案. (5认同)
  • 你需要包括什么? (3认同)

Mar*_*ska 9

从 C++14 使用 std 及其数字文字:

#include <chrono>
#include <thread>

using namespace std::chrono;

std::this_thread::sleep_for(123ms);
Run Code Online (Sandbox Code Playgroud)

  • 简而言之,它是作为用户定义的文字实现的,与定义其他运算符类似: long double 运算符 "" ms(long double) 在我看来,它比 `chrono::milliseconds(1000)` 更具可读性。有关详细信息,请参阅[用户定义的文字][1]。[1]:https://en.cppreference.com/w/cpp/language/user_literal (6认同)
  • 这是如何实施的?“123ms”看起来很奇怪。 (3认同)

小智 7

如果使用MS Visual C++ 10.0,则可以使用标准库工具执行此操作:

Concurrency::wait(milliseconds);
Run Code Online (Sandbox Code Playgroud)

你会需要:

#include <concrt.h>
Run Code Online (Sandbox Code Playgroud)

  • 当你实际上没有意思时,不要使用"标准"这个词.`<concrt.h>`不是*标准库头 - 它可能是一个平台库; 在这种情况下,您应该清楚地说明先决条件. (9认同)

Max*_*kin 6

在具有该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.
    }
}
Run Code Online (Sandbox Code Playgroud)

然而,现在有更好的替代品。