2016-11-25 2 views
0

Я пытаюсь запустить мой цикл while каждые 10 мс. Код внутри while довольно прост, поэтому для запуска не требуется значительного времени. Есть ли другой способ, кроме использования функции Sleep() в конце while? Что-то более точное?Предоставление времени для запуска каждые X ms

Я использую Visual Studio.

+0

Почему 10ms? Разрешение по умолчанию для окон составляет 15,6 мс. Зачем вам больше? Вы пытаетесь контролировать анимацию? Это * не * правильный способ обработки мультимедиа –

ответ

0

Я бы сказал, что это должно быть достаточно точным. Если вы хотите, чтобы код выполнялся ровно через каждые 10 мс, вам нужно измерить длину выполнения кода, а затем выполнить Sleep для 10ms - <length of execution in ms>.

Для измерения с максимальной точностью вы можете использовать high_resolution_clock, который работает, по крайней мере, с системным расценком или лучше. http://www.cplusplus.com/reference/chrono/high_resolution_clock/

0

В Windows вы можете использовать SetTimer.

Однако это может быть чрезмерно сложным, особенно если ваш обратный вызов требует доступа к классу. Вы должны проверить std::this_thread::sleep_for

std::this_thread::sleep_for(std::chrono::milliseconds(10)); 
+2

Sleeping не может гарантировать, что что-то будет выполняться каждые 10 секунд. Таймеры Windows имеют точность по умолчанию 15,6 мс, и даже тогда переключение потоков может привести к задержкам –

+0

Хорошая точка зрения, я не знал о точности по умолчанию - есть ли у вас ссылка, где я могу прочитать об этом? – pierobot

0

, если вам нужно, чтобы запустить его ровно через каждые 10 мс, лучше подождать в спин цикла. псевдокод:

while (your_condition) 
{ 
    var t = curTime; 
    do_what_you_need; 
    while (curTime - t < 10); 
} 
2

Вместо std::this_thread::sleep_for, то лучше всего использовать sleep_until для этого типа задержки. Это будет автоматически принимать во внимание то, как долго другой код внутри цикла принимает (однако тривиальный или нет):

#include <chrono> 
#include <iostream> 
#include <thread> 

int 
main() 
{ 
    using namespace std::chrono; 
    auto next = steady_clock::now(); 
    while (true) 
    { 
     std::cout << "hi\n"; 
     next += 10ms; 
     std::this_thread::sleep_until(next); 
    } 
} 
0

Оба Sleep и Waitable Timers использования резьба за кулисами, поэтому разрешение в порядке по умолчанию временной срез, который составляет 10-20 мс. Если вам требуется более высокое разрешение, вы должны посмотреть в Мультимедийные таймеры. The documentation обещает более 1 мс разрешение. Интерфейс SetTimer/WM_TIMER на руке, по-видимому, имеет фиксированное разрешение 15,6 мс, как говорили другие.

Другой интерфейс синхронизации с высоким разрешением - Performance Counter, но, похоже, вы можете запросить их, а не ждать ни на что, так что у вас будут простаивающие петли ожидания (вращение) с ними.

Смежные вопросы