2013-06-27 164 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

相關問題