Нужно лучшее решение для ожидания - PullRequest
3 голосов
/ 05 ноября 2010

Недавно я писал программу на C ++, которая пингует три разных веб-сайта, а затем, в зависимости от того, пройден ли он или нет, будет ждать 5 минут или 30 секунд, прежде чем он попытается снова.

В настоящее время я использую ctimeбиблиотека и следующая функция для обработки моего ожидания.Однако, по мнению моего измерителя ЦП, это неприемлемое решение.

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

Причина, по которой это решение неприемлемо, заключается в том, что, согласно моему измерителю ЦП, программа ожидает от 48% до 50% от моего ЦП при ожидании,У меня процессор Athlon 64 x2 1,2 ГГц.Моя скромная 130-строчная программа не может даже приблизиться к 50%.

Как лучше написать функцию ожидания, чтобы она использовала только минимальные ресурсы?

Ответы [ 5 ]

13 голосов
/ 05 ноября 2010

Чтобы оставаться портативным, вы можете использовать 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;
}
6 голосов
/ 15 марта 2012

Со стандартом C ++ 11 можно использовать следующий подход:

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

В качестве альтернативы можно использовать sleep_until.

3 голосов
/ 05 ноября 2010

Просто для того, чтобы объяснить, что происходит: когда вы вызываете clock (), ваша программа снова получает время: вы просите ее сделать это так быстро, как только возможно, до достижения конечного времени ... что оставляет ядро ​​ЦП, на которомзапрограммируйте «вращение» так быстро, как только можете, через цикл, считывая время миллионы раз в секунду в надежде, что оно будет перенесено на конечное время.Вместо этого вам нужно сообщить операционной системе, что вы хотите проснуться через некоторый интервал ... тогда они могут приостановить вашу программу и позволить другим программам работать (или система бездействует) ... это то, что различные функции сна упоминали в другихответы для.

3 голосов
/ 05 ноября 2010

Используйте sleep вместо пустого цикла while.

0 голосов
/ 05 ноября 2010

В windows.h есть Sleep, в * nix есть сон в unistd.h.

Есть более элегантное решение @ http://www.faqs.org/faqs/unix-faq/faq/part4/section-6.html

...