2010-11-05 72 views
4

最近,我一直在用C++編寫一個程序,該程序會ping三個不同的網站,然後根據通過或失敗情況等待5分鐘或30秒鐘,然後再次嘗試。需要一個更好的等待解決方案

目前我一直在使用ctime庫和下面的函數來處理我的等待,但是根據我的CPU計量表這是一個不可接受的解決方案。

void wait (int seconds) 
{ 
    clock_t endwait; 
    endwait = clock() + seconds * CLOCKS_PER_SEC; 
    while (clock() < endwait) {} 
} 

之所以這樣的解決方案是不可接受的,因爲根據我的CPU米程序等待當在我的CPU的48%至50%延伸。我有一個Athlon 64 x2 1.2GHz的處理器。我的謙虛的130線計劃不應該接近50%。

我在問的是如何更好地編寫我的等待函數,以便它只使用最少的資源?謝謝。

回答

13

要保持便攜式你可以使用Boost::Thread睡覺:

#include <boost/thread/thread.hpp> 

int main() 
{ 
    //waits 2 seconds 
    boost::this_thread::sleep(boost::posix_time::seconds(1)); 
    boost::this_thread::sleep(boost::posix_time::milliseconds(1000)); 

    return 0; 
} 
+0

我喜歡這個想法,但是我使用的是Windows,我似乎沒有文件。 – Samuel 2010-11-05 06:09:25

+0

Boost也可以在Windows上使用,您只需安裝庫。 [入門指南](http://www.boost.org/doc/libs/1_44_0/more/getting_started/windows.html)或下載[預編譯版本](http://www.boostpro.com/download/ ) – MOnsDaR 2010-11-05 06:10:14

+0

請記住,在多線程環境中,''boost :: this_thread :: sleep'會爲您的代碼添加一箇中斷點。 http://www.boost.org/doc/libs/1_49_0/doc/html/thread/thread_management.html – 2013-07-18 09:30:49

2

使用sleep而不是空的while循環。

2

只是爲了解釋發生了什麼:當你調用時鐘()程序再次檢索時間:你要求它儘可能快地做到這一點,直到它達到結束時間......這會讓CPU內核以最快的速度運行程序「旋轉」,通過循環讀取數據,每秒讀取數百萬次希望它能夠延期到最後。你需要告訴操作系統你想在間隔後喚醒......然後他們可以暫停你的程序並讓其他程序運行(或系統空閒)......這就是其他程序中提到的各種睡眠功能答案是。

5

用C++ 11標準以下方法可以用來:

std::this_thread::sleep_for(std::chrono::milliseconds(100)); 
std::this_thread::sleep_for(std::chrono::seconds(100)); 

備選地sleep_until可以被使用。

+1

哇!謝謝,我不知道它可以以平臺無關的便攜方式完成:) – legends2k 2012-11-08 10:21:35