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

我试图在一个 C + + 程序中添加一个定时延迟,并且想知道是否有人对我可以尝试什么或者我可以查看什么信息有任何建议?

我希望我有更多的细节,我是如何实现这个时间延迟,但直到我有更多的信息,如何添加一个时间延迟,我甚至不知道我应该如何尝试实现这一点。

608542 次浏览

你想要一些简单的东西吗,比如:

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

句法:

无效睡眠(无符号秒) ;

Sleep ()暂停执行一段时间(秒)。 通过调用 sleep,当前程序将在参数秒指定的秒数内暂停执行。间隔只精确到百分之一秒或操作系统时钟的精确度,以精确度较低者为准。

如果希望获得微秒级精度,还可以使用 select (2)(这在没有 ussleep (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);
}

`

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

这也将睡眠三秒钟,但是您可以对这些数字进行一些细化。

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

另外,您没有列出为什么需要休眠,但是通常应该避免使用延迟作为同步的一种方法。

是的,睡眠可能是这里选择的功能。请注意,传递到函数中的时间是调用线程处于非活动状态的最小时间量。因此,例如,如果您以5秒钟调用 sleep,则可以保证线程将至少睡眠5秒钟。可能是6,或8或50,取决于操作系统正在做什么。(在最佳操作系统执行期间,这将非常接近5。)Sleep 函数的另一个有用的特性是传入0。这将强制从线程切换上下文。

一些补充信息:
Http://www.opengroup.org/onlinepubs/000095399/functions/sleep.html

许多其他人提供了睡眠的好信息。我同意韦奇的观点,睡眠很少是最合适的解决办法。

如果你在等待某件事情的时候睡觉,那么你最好等待那件事情/事件。查看这里的条件变量。

我不知道您想在什么操作系统上进行这项工作,但是对于线程和同步,您可以查看 增强线程库(Boost 条件变量)。

现在移动到另一个极端,如果你正在尝试等待特别短的时间,然后有一对夫妇的黑客风格的选择。如果你在某种嵌入式平台上工作,但是没有实现“ sleep”,那么你可以尝试一个简单的循环(for/while 等) ,但是主体是空的(小心编译器没有优化它)。当然,在这种情况下,等待时间取决于特定的硬件。 对于非常短的“ wait”,您可以尝试使用程序集“ nop”。我非常怀疑这些是你想要的,但是如果不知道为什么你需要等待,就很难说得更具体。

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

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纳秒,但实现可能会以睡眠1毫秒结束,如果这是最短的话。

我发现,如果包含 chrono库,那么 "_sleep(milliseconds);"(没有引号)在 Win32中工作得很好

例如:

#include <chrono>


using namespace std;


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

确保在睡眠前包含下划线。

您可以尝试下面的代码片段:

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

为了将 cpp 中的输出延迟到固定的时间,可以通过包含 windows.h 头文件来使用 Sleep ()函数 Sleep ()函数的语法是 Sleep (time _ in _ ms) 作为

cout<<"Apple\n";
Sleep(3000);
cout<<"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;
}