2008-10-01 20 views
47

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

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

+2

这取决于什么平台(OS)和你有什么库可用。 – 2008-10-01 16:50:53

回答

5

你想为简单的像

sleep(3); 
+1

不适用于Windows ... – PierreBdR 2008-10-01 16:58:51

+0

它应该。它几乎是普遍的。你试过什么语言/编译器?你是否导入了所有必要的库? – 2008-10-01 17:12:39

+0

我不明白为什么它没有标记为答案或没有太多upvoted – ImranNaqvi 2016-11-01 16:39:45

0

语法的东西:

无效睡眠(无符号秒);

sleep()暂停执行间隔(秒)。 调用睡眠时,当前程序暂停执行秒数指定的秒数。间隔仅精确到百分之一秒或操作系统时钟的准确度,两者中精确度较低者。

3

您还可以使用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); 
} 

`

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

这也睡三秒钟。你可以稍微改进一下数字。

8

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

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

2

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

一些额外的信息:
http://www.opengroup.org/onlinepubs/000095399/functions/sleep.html

0

还有许多人提供了良好的睡眠信息。我同意Wedge认为睡眠很少是最合适的解决方案。

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

我不知道你想要做什么操作系统,但对于线程和同步,你可以看看Boost Threading库(Boost Condition Varriable)。

如果您试图等待极短的时间,那么现在转到另一个极端,然后有几个黑客风格选项。如果您正在某种嵌入式平台上执行“睡眠”,那么您可以尝试一个简单的循环(for/while等),使用空的主体(小心编译器不会优化它)。当然在这种情况下,等待时间取决于具体的硬件。 对于真的很短的'等待',你可以尝试组装“nop”。我非常怀疑这些都是你以后的事情,但不知道为什么你需要等待它很难变得更具体。

0

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

63

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

通过这些功能也不再是一个需要不断增加新的功能,更好的分辨率:sleepusleep,nanosleep等。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

我发现"_sleep(milliseconds);"(不带引号)非常适用于Win32的如果包括chrono

E.g:

#include <chrono> 

using namespace std; 

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

请务必包括睡眠前的下划线。

1

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

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

以延缓CPP输出固定的时间,你可以通过包括WINDOWS.H头文件 语法睡眠使用Sleep()函数()函数睡眠(time_in_ms) 作为

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

输出。上面的代码将打印苹果,并等待3秒钟,然后打印芒果。