Выполнение мер при выполнении кода c ++ каждые t миллисекунд

Для цикла while и упорядочения функции следующим образом:

int k=0; int total=100; while(k<total){ doSomething(); if(approx. t milliseconds elapsed) { measure(); } ++k; } 

Я хочу выполнить «меру» каждые t-е миллисекунды. Однако, поскольку «doSomething» может быть близким к t-м миллисекунде от последнего исполнения, допустимо выполнить измерение после приблизительно t миллисекунд, прошедших с последней меры. Мой вопрос: как это можно достичь?

Одним из решений было бы установить таймер на ноль и измерить его после каждого «doSomething». Когда он принимает приемлемый диапазон, я выполняю меры и сбрасываю. Однако я не являюсь той функцией c ++, которую я должен использовать для такой задачи. Как я вижу, есть определенные функции, но дебаты о том, какие из них наиболее подходят, вне моего понимания. Обратите внимание, что некоторые функции фактически учитывают время, затраченное некоторыми другими процессами, но я хочу, чтобы мой таймер измерял только время выполнения моего кода на C ++ (я надеюсь, что это понятно). Другое дело – разрешение измерений, как указано ниже. Предположим, что средний вариант предложенных.

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

 #define SAMPLE_PERIOD_MS 100 #define SAMPLE_PERIOD_TICKS ((CLOCKS_PER_SEC * SAMPLE_PERIOD_MS) / 1000) int k=0; int total=100; clock_t measure_time = clock() + SAMPLE_PERIOD_TICKS ; while(k 0 ) { measure(); measure_time += SAMPLE_PERIOD_TICKS ; ++k; } } в #define SAMPLE_PERIOD_MS 100 #define SAMPLE_PERIOD_TICKS ((CLOCKS_PER_SEC * SAMPLE_PERIOD_MS) / 1000) int k=0; int total=100; clock_t measure_time = clock() + SAMPLE_PERIOD_TICKS ; while(k 0 ) { measure(); measure_time += SAMPLE_PERIOD_TICKS ; ++k; } } 

При необходимости вы можете заменить clock () другим источником часов с высоким разрешением.

Однако обратите внимание на пару вопросов. Этот метод является «занятой петлей»; если только doSomething () или measure () не выдаст CPU, процесс займет все циклы процессора. Если это единственный код, запущенный на цели, это может не иметь значения. С другой стороны, это работает на ОС общего назначения, такой как Windows или Linux, которые не являются в режиме реального времени, процесс может быть предотвращен другими процессами, и это может повлиять на точность периодичности выборки. Если вам нужно точное использование времени RTOS и выполнение doSomething () и measure () в отдельных streamах было бы лучше. Даже в GPOS это было бы лучше. Например, общий шаблон (с использованием созданного API в отсутствие каких-либо спецификаций) будет:

 int main() { StartThread( measure_thread, HIGH_PRIORITY ) ; for(;;) { doSomething() ; } } void measure_thread() { for(;;) { measure() ; sleep( SAMPLE_PERIOD_MS ) ; } } 

Код для measure_thread() является точным только в том случае, если measure() занимает незначительное время для запуска. Если потребуется значительное время, вам может понадобиться учитывать это. Если он не является детерминированным, вам даже придется измерять время его выполнения, чтобы вычесть его в период ожидания.