2013-06-27 134 views
6

我有一个循环,我想确保它运行每个循环(大约)固定的时间量。替代std :: this_thread :: sleep_for()

我使用sleep_for来实现这种行为,但我也希望程序能够在不包含标准线程库完全支持的环境下编译。现在,我有这样的事情:

using namespace std; 
using namespace std::chrono; 

// 
while(!quit) 
{ 
    steady_clock::time_point then = steady_clock::now(); 

    //...do loop stuff 

    steady_clock::time_point now = steady_clock::now(); 
#ifdef NOTHREADS 
    // version for systems without thread support 
    while(duration_cast<microseconds>(now - then).count() < 10000) 
    { 
     now = steady_clock::now(); 
    } 

#else 
    this_thread::sleep_for(microseconds{ 10000 - duration_cast<microseconds>(now - then).count() }); 
#endif 

} 

虽然这允许程序在不支持标准的线程环境中编译,它也非常CPU密集型的程序检查持续的时间条件,而不是等待直到它是真实的。

我的问题是:在没有完全支持线程的环境中,是否有一种使用标准C++(即不增强)启用此“等待”行为的资源密集型方法?

+0

不是我所知道的,除非你使用'sleep_until'。 – chris

+1

这将是艰难的。如果你可以使用boost,那么有很多定时的回调函数可以让你轻松做到这一点。看到[这里](http://stackoverflow.com/questions/4363458/timer-callback-in-c) –

+1

我曾经使用'select'在一个空的fdset上 –

回答

2

有很多基于时间的功能,它非常依赖于您使用的操作系统。

Microsoft API提供睡眠()(大写字母S),它会让您有一个毫秒的睡眠时间。

在Unix(POSIX)下,您有nanosleep()。

我认为这两个函数应该让你在大多数计算机上运行。

该实现将使用相同的循环,但在while()循环内稍微休眠一下。这仍然是一个像事情池,但 更快 更少CPU密集。

此外,作为中午。提到,select()具有这种能力。实施起来会更复杂一些,但预计会在一段时间后返回。

+0

感谢您的建议,我会研究这些替代方案。看起来,使用C++ 11功能将需要有条件地使用替代方法(在这种情况下),直到这些功能得到广泛支持。 – trm

相关问题