Требуется лучшее решение для ожидания

Недавно я писал программу на С++, которая пингует три разных веб-сайта, а затем в зависимости от прохода или сбоя она будет ждать 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.2ghz. Нет никакой возможности, чтобы моя скромная 130-линейная программа даже приблизилась к 50%.

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

Ответ 1

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

Ответ 2

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

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

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

Ответ 3

Используйте sleep, а не пустой цикл while.

Ответ 4

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