【问题标题】:Sleep for milliseconds休眠几毫秒
【发布时间】:2011-05-10 05:26:35
【问题描述】:

我知道 POSIX sleep(x) 函数使程序休眠 x 秒。有没有一个函数可以让程序在 C++ 中休眠 x 毫秒

【问题讨论】:

  • 您应该知道,无论如何,在 Windows 中,Sleep() 具有毫秒精度,但它的准确度 可以高出几个数量级。你可能认为你睡了 4 毫秒,但实际上睡了 400 毫秒。
  • @John Dibling:我认为他使用的是 POSIX sleep,而不是 win32 Sleep 给定“x 秒”。
  • 虽然 C 和 C++ 有不同的名称修饰,这可能是错误和不兼容的根源,但在大多数情况下,在 C++ 中使用 C 头文件是可以的。但是,如果您想绝对确定没有任何问题,请使用 #include extern "C" {} 块内的 C 标头。此外,如果您在同一个项目中有 C 和 C++ 源文件,强烈建议您这样做以避免任何问题,特别是如果您在两种源文件中包含相同的头文件(在这种情况下这是必要的) .如果你有一个纯 C++ 项目,它可能完全没有问题。
  • @JohnDibling 不,不是 400 毫秒。您可能得到的最差精度来自 Windows 9x,其GetTickCount 的分辨率为 55 毫秒;更高版本的分辨率为 16 毫秒或更低。一位用户thought he was getting 16ms resolution from Sleep 但随后报告说Sleep 本身相当准确,而明显的不精确是由于使用GetTickCount 来衡量时间的流逝造成的。

标签: c++ linux sleep


【解决方案1】:

在 C++11 中,您可以使用标准库工具来做到这一点:

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

清晰易读,无需再猜测sleep()函数采用什么单位。

【讨论】:

  • std::this_thread::sleep_for 是否定义了中断点?像 boost::this_thread_sleep 一样吗?
  • 这是正确的做法。时期。线程是跨平台的,也是计时的。
  • @Void。这当然是一个很好的方法,但是“the”和“period”是非常强的词。
  • 是忙着睡觉吗?我需要在睡眠期间屈服于另一个线程;我可以使用sleep_for 吗?
  • @Michael:这不是忙睡眠,它会让给其他线程。
【解决方案2】:

请注意,没有标准的毫秒级 C API,因此(在 Unix 上)您将不得不接受usleep,它接受微秒:

#include <unistd.h>

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

【讨论】:

【解决方案3】:

为了保持便携,您可以使用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;
}

这个答案是重复的,之前已经在this question 上发布过。也许你也可以在那里找到一些有用的答案。

【讨论】:

【解决方案4】:

在 Unix 中,您可以使用 usleep

在 Windows 中有Sleep

【讨论】:

  • Windows 调用以毫秒为单位。
  • 您必须分别包含
  • 是的,但实际时间分辨率不能是 15-16 毫秒(即使调用中的单位是 1 毫秒),因此最短时间是 15-16 毫秒?
【解决方案5】:

根据您的平台,您可能有usleepnanosleep 可用。 usleep 已弃用,并已从最新的 POSIX 标准中删除;首选nanosleep

【讨论】:

  • 请注意,虽然 usleep() 是在 &lt;unistd.h&gt; 中声明的,但令人困惑的是,nanosleep() 是在 &lt;time.h&gt;/&lt;ctime&gt; 中声明的。
【解决方案6】:

为什么不使用 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 处于空闲状态 [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;
}

【讨论】:

  • 该代码的问题之一是它是一个繁忙的循环,它将继续使用 100% 的单个处理器内核。睡眠功能是围绕一个操作系统调用实现的,它将使当前线程进入睡眠状态并执行其他操作,并且只有在指定时间到期时才会唤醒线程。
  • 你是对的 - 它会消耗 100% 的一个 CPU 内核。所以这里是使用系统睡眠功能重写的代码 - 它仍然是跨平台的:
  • @BartGrzybicki 我知道这是一个旧答案,但在 Windows 机器上的 Visual Studio 2017 中,#ifdef WIN32 默认情况下不会评估为 true。
  • @kayleeFrye_onDeck 代码错误。应该是#ifdef _WIN32
  • @Contango 我知道!但不是当我写那...大声笑。感谢您的跟进!
【解决方案7】:
#include <chrono>
#include <thread>

std::this_thread::sleep_for(std::chrono::milliseconds(1000)); // sleep for 1 second

记得导入这两个头文件。

【讨论】:

【解决方案8】:

nanosleep 是比 usleep 更好的选择 - 它对中断更具弹性。

【讨论】:

  • 我熟悉usleep,但不熟悉nanosleep。您应该提供一个在 Linux 上使用它的示例。
【解决方案9】:
#include <windows.h>

语法:

Sleep (  __in DWORD dwMilliseconds   );

用法:

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

【讨论】:

  • 您需要为此添加什么?
  • #include &lt;WinBase.h&gt;
  • 不,你需要#include &lt;windows.h&gt;
  • 这个问题强烈暗示需要 POSIX 解决方案。
【解决方案10】:

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

#include <chrono>
#include <thread>

using namespace std::chrono;

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

【讨论】:

  • 这是如何实现的? 123ms 看起来很奇怪。
  • 简而言之,它被实现为用户定义的文字,类似于您定义其他运算符:long double operator "" ms(long double) 在我看来它比chrono::milliseconds(1000) 更具可读性。有关详细信息,请参阅 [用户定义的文字][1]。 [1]:en.cppreference.com/w/cpp/language/user_literal
  • 哇。这太疯狂了。
【解决方案11】:

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

Concurrency::wait(milliseconds);

你需要:

#include <concrt.h>

【讨论】:

  • 当你没有真正的意思时,不要使用“标准”这个词。 &lt;concrt.h&gt; 不是标准库头文件 - 它可能是平台库;在这种情况下,您应该清楚地说明先决条件。
  • 不仅如此,我们还希望linux 问题使用流行的编译器之一。
【解决方案12】:

在具有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 它确实可以编译。就是不链接。查找您的 Windows 文档。
  • 你用什么标头来表示 timeval ??
  • @TotteKarlsson &lt;sys/time.h&gt;.
【解决方案13】:

在 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

【讨论】:

  • 没有限制是什么意思?它肯定有 0xFFFFFFFE 的限制。等待 0xFFFFFFFF 不会超时(这意味着它将等到程序结束)。
  • 我不是那个意思,Izzy,很抱歉我们的误解。我的意思是你可以输入任何正数的毫秒数。所以它会等待那么多毫秒来关闭程序。如果你不明白请说出来,我会再给你解释。
  • 是的,但实际的时间分辨率是多少?在某些情况下不能是 15-16 毫秒吗?例如,如果您使用 Sleep(3),它实际上会休眠 3 毫秒还是 15-16 毫秒?
  • 我不认为“windows.h”是标准的 POSIX 或 Linux 头文件...
【解决方案14】:

选择调用是一种更精确的方法(睡眠时间可以以纳秒为单位指定)。

【讨论】:

  • 虽然这可能是解决问题的一个有价值的提示,但一个好的答案也可以证明解决方案。请edit 提供示例代码来说明您的意思。或者,考虑将其写为评论。
【解决方案15】:

使用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 毫秒吗?你量过吗?
【解决方案16】:

作为 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 标准中删除。
【解决方案17】:

这个问题很老,但我设法找到了一个简单的方法来在我的应用程序中使用它。您可以创建一个 C/C++ 宏,如下所示使用它:

#ifndef MACROS_H
#define MACROS_H

#include <unistd.h>

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

#endif // MACROS_H

【讨论】:

  • 你的意思可能是usleep((X) * 1000) - 这就是函数比宏好得多的原因之一!
【解决方案18】:

对于 C 使用 /// 在 gcc 中。

#include

然后使用 Sleep(); /// Sleep() 大写 S。不是 sleep() 和 s 。

//Sleep(1000) 是 1 秒 /// 可能。

clang支持sleep(),sleep(1)是1秒延时/等待。

【讨论】:

  • 这不适用于 UNIX 系统
猜你喜欢
  • 2019-03-07
  • 2021-11-20
  • 1970-01-01
  • 2011-09-06
  • 1970-01-01
  • 1970-01-01
  • 2013-01-26
  • 2011-08-13
  • 2010-09-10
相关资源
最近更新 更多