Это мой код, используя QueryPeformanceCounter
как таймер.Точный способ уменьшить использование ЦП в бесконечном цикле
//timer.h
class timer {
private:
...
public:
...
double get(); //returns elapsed time in seconds
void start();
};
//a.cpp
void loop() {
timer t;
double tick;
double diff; //surplus seconds
t.start();
while(running) {
tick = t.get();
if(tick >= 1.0 - diff) {
t.start();
//things that should be run exactly every second
...
}
Sleep(880);
}
}
Без Sleep
этот цикл будет продолжаться бесконечно вызова t.get()
каждый раз, что вызывает высокую загрузку процессора. По этой причине я засыпаю около 880 миллисекунд, чтобы он не вызывал t.get()
, пока это не нужно.
Как я уже говорил, в настоящее время я использую Sleep
, чтобы сделать трюк, но я беспокоюсь о точности Sleep
. Я где-то читал, что фактические миллисекунды пауз программы могут варьироваться - от 20 до 50 мс - причина, по которой я установил параметр 880
. Я хочу как можно больше сократить использование ЦП; Я хочу, если возможно, приостановить более 990 миллисекунд EDIT: и все же менее 1000 миллисекунд между каждым циклом. Каким будет лучший способ?
Лучший способ пойти бы бросить, опираясь на точные моменты времени в Windows. Это не было надумано с учетом этого. Даже при плотной петле и вообще не спать, нет ничего, что помешало бы Windows перейти на другую задачу, как только вы достигнете отметки в 1 секунду. –
Возможный дубликат [Как использовать API SetTimer] (http://stackoverflow.com/questions/15685095/how-to-use-settimer-api) – user3528438
Это не очень хорошая стратегия, вы никогда не хотите, чтобы ОС хорошая причина, чтобы * остановить * запуск вашего кода. Вы хотите дать ему вескую причину * начать * его. Что вы можете сделать, сделав Sleep() точным, вызовите timeBeginPeriod(). Дайте ему более веские причины, вызвав SetThreadPriority(). timeSetEvent() - хороший способ получить довольно последовательный таймер, который может настраиваться на латентность, будьте осторожны, это асинхронно. Вы никогда не получите его более точным, чем 1 мс, и вы никогда не сможете предположить, что он всегда будет 1 мс. Ядро и драйверы устройства всегда будут первыми. –