Я использую Visual Studio 2012 и C ++, мне нужно вызывать функцию каждые 5 минут, мне удалось это сделать, но она потребляет 25% моего процессора, что далеко от идеала.
Код выглядит следующим образом:
time_t start;
time_t end;
time(&start);
while (1) {
time(&end);
double dif = difftime (end,start);
if (dif >= 300) { autofunction(); time(&start);} else {} }
Есть ли более эффективный для ЦП способ вызова функции каждые 5 минут или какой-либо способ замедлить цикл while?
Любое руководство будет с благодарностью.
В Windows есть Sleep (), и для чего-то, что происходит каждые 300 секунд, это прекрасно. В Windows также есть таймеры, которые могут принимать аргумент timerproc, который является функцией, но учтите, что это функция C, а не C ++, поэтому она не должна быть функцией-членом класса, если она не является статической.
Так как никто не предложил, вы можете просто создать новый std::thread
а также Sleep
в этом.
Что вы делаете занят ожидания. Вы постоянно проверяете, сколько времени прошло, и тратите время процессора.
Так как вы на окнах, Использование очередей таймера может быть интересным.
Это создает таймер с функцией обратного вызова. Вы можете выполнять другую работу, ожидая истечения таймера.
Я думаю, что лучший ответ будет зависеть от некоторых деталей того, что вы делаете. Если вам нужно, чтобы оно составляло приблизительно 5 минут, возможно, вы можете поместить вычисление истекшей продолжительности в более удобное для программирования место, и вы начнете задание впервые через 5 минут после проверки.
В противном случае, похоже, что @BartekBanachewicz имеет лучшее предложение для запуска потока, который использует sleep
— без блокировки вашего основного потока, делающего все, что вы делаете. Пока ваш основной поток будет определенно работать дольше, чем 5 минут, не должно быть проблемой всегда повторятьjoin()
поток в конце, или когда-либо.
Преимущество использования потоков состоит в том, что они не требуют каких-либо специфических для Windows вещей, например Предложение @ OlafDietsche, независимо от того, какие очереди таймера. С c ++ 0x потоки очень просты в использовании, смотрите: http://en.cppreference.com/w/cpp/thread/thread; http://www.justsoftwaresolutions.co.uk/threading/multithreading-in-c++0x-part-1-starting-threads.html