Приведу сразу фрагмент кода:
t1 = timeGetTime();
Device.sendRequest( Command1 );
R1 = Device.readResponse();
Device.sendRequest( Command2 );
R2 = Device.readResponse();
t2 = timeGetTime();
cout << t2-t1 << " ms" << endl;
На некоторое устройство по интерфейсу RS-232 посылаем некоторый запрос, затем дожидаемся ответа и повторяем все еще раз. Для замера времени работы используется Multimedia Timer. Возникает два вопроса:
1) Насколько вообще корректно подобным образом замерять время работы? Данный таймер, как заявляет майкрософт, обеспечивает разрешение 1 мс. В реальных условиях данный код выполняется(по данным этого таймера) за 20..50 мс, и точность этого измерения играет критичную роль в решении задачи.
2) Собственно, главный вопрос. Работаем мы в многозадачной среде. Если прогнать вышеприведенный замер, скажем, 100 раз подряд, в среднем получаются значения 20..30 мс, что более-менее сходится с теоретическими расчетами для данной скорости передачи и длины сообщений. Однако, периодически встречаются выбросы в 50..60 мс, а этот момент имеет принципиальное значение. Если мое предположение верно, где-то в процессе ожидания ответа или перед посылкой второго запроса процесс может быть сочтен ожидающим и планировщик «вклинивает» на выполнение какой-то посторонний процесс. Разумеется, возможно дело в самом оборудовании, но хотелось бы исключить влияние ОС. Собственно, вопрос: подскажите, пожалуйста, грамотный способ: как можно повысить приоритет для данного участка кода, чтобы он выполнялся максимально монопольно, без непредсказуемых задержек со стороны ОС?
У меня сейчас нет возможности попробовать самому, но удалось нагуглить про функции SetPriorityClass() и SetThreadPriority(). Это хотя бы верное направление, поможет решить задачу?