繁体   English   中英

如何在 C++ 程序中添加定时延迟?

[英]How do you add a timed delay to a C++ program?

我正在尝试在 C++ 程序中添加定时延迟,并且想知道是否有人对我可以尝试的内容或我可以查看的信息有任何建议?

我希望我有更多关于我如何实现这个定时延迟的细节,但是在我有更多关于如何添加一个定时延迟的信息之前,我不确定我应该如何尝试实现这个。

C++11 的更新答案:

使用sleep_forsleep_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类型接受任何分辨率的值; 小时、秒、飞秒等

在 C++14 中,您可以使用nanosecondsseconds的文字后缀进一步简化代码:

#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 纳秒,但实现可能最终睡眠一毫秒,如果这是它可以做到的最短时间。

在 Win32 中

#include<windows.h>
Sleep(milliseconds);

在 Unix 中

#include<unistd.h>
unsigned int microsecond = 1000000;
usleep(3 * microsecond);//sleeps for 3 second

sleep()只需要几秒钟,这通常太长了。

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

这也将休眠三秒钟。 不过,您可以再细化一些数字。

你想要像这样简单的东西:

#include <unistd.h>
sleep(3);//sleeps for 3 second

请注意,这并不能保证线程休眠的时间量将接近休眠期,它只能保证线程继续执行之前的时间量至少是所需的量。 实际延迟将根据情况(尤其是相关机器上的负载)而有所不同,并且可能比所需的睡眠时间高几个数量级。

此外,您没有列出为什么需要睡觉,但通常应该避免使用延迟作为同步方法。

你可以试试这个代码片段:

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

我发现"_sleep(milliseconds);" (不带引号)如果包含chrono库,则适用于 Win32

例如:

#include <chrono>

using namespace std;

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

确保在睡觉前包括下划线。

如果您想要微秒精度,您也可以使用 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 秒。 可能是 6、8 或 50,具体取决于操作系统在做什么。 (在最佳操作系统执行期间,这将非常接近 5。)
sleep 函数的另一个有用功能是传入 0。这将强制从您的线程进行上下文切换。

一些附加信息:
http://www.opengroup.org/onlinepubs/000095399/functions/sleep.html

要将 cpp 中的输出延迟固定时间,您可以使用 Sleep() 函数,方法是将 Sleep() 函数的 windows.h 头文件语法包含为 Sleep(time_in_ms) 作为

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

输出。 上面的代码将打印 Apple 并在打印 Mango 之前等待 3 秒。

这里的最佳答案似乎是依赖于操作系统的答案; 对于更便携的解决方案,您可以使用 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;
}

句法:

无效睡眠(无符号秒);

sleep() 暂停执行一段时间(秒)。 调用 sleep 时,当前程序将暂停执行参数 seconds 指定的秒数。 间隔仅精确到最接近的百分之一秒或操作系统时钟的精确度,以较不精确的为准。

许多其他人提供了很好的睡眠信息。 我同意 Wedge 的观点,即睡眠很少是最合适的解决方案。

如果您在等待某事时正在睡觉,那么您最好实际等待那件事/事件。 为此,请查看条件变量。

我不知道您要在什么操作系统上执行此操作,但是对于线程和同步,您可以查看Boost Threading库( Boost Condition Varriable )。

现在转向另一个极端,如果您想等待极短的时间,那么有几个黑客风格的选择。 如果您正在某种未实现“睡眠”的嵌入式平台上工作,那么您可以尝试一个带有空体的简单循环(for/while 等)(注意编译器不会对其进行优化)。 当然,在这种情况下,等待时间取决于特定的硬件。 对于非常短的“等待”,您可以尝试组装“nop”。 我非常怀疑这些是你所追求的,但不知道为什么你需要等待,很难说得更具体。

在 Windows 上,您可以包含 Windows 库并使用“Sleep(0);” 使程序休眠。 它需要一个代表毫秒的值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM