Могу ли я установить для одного потока приоритет выше 15 для процесса с нормальным приоритетом?

У меня есть приложение для сбора данных, работающее в Windows 7 с использованием VC2010 на C++. Один поток — это сердцебиение, которое отправляет изменение каждые 0,2 секунды, чтобы поддерживать работоспособность некоторого оборудования, время ожидания которого составляет около 0,9 секунды. Обычно вызов пульса занимает 10-20 мс, а остальное время поток спит.

Однако иногда может возникать задержка в 1-2 секунды, после чего оборудование моментально отключается. Поток пульса работает с THREAD_PRIORITY_TIME_CRITICAL, что равно 15 для процесса с обычным приоритетом. Другие мои потоки работают с нормальным приоритетом, хотя я использую DLL для управления некоторым другим оборудованием и заметил с помощью Process Explorer, что он запускает несколько потоков, работающих на уровне 15.

Я не могу отследить источник замедления. но другие объявления в моем приложении видят такие же задержки, когда это происходит. Я сделал несколько оптимизаций кода сердцебиения, хотя это довольно просто, но случайные сбои все еще случаются. Теперь мне интересно, могу ли я увеличить приоритет этого потока выше 15 без указания REALTIME_PRIORITY_CLASS для всего процесса.Если нет, есть ли недостатки, о которых мне следует знать при использовании REALTIME_PRIORITY_CLASS? (Кроме этого потока сердцебиения, остальная часть приложения не нуждается в синхронизации в реальном времени.)

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

Обновление: поэтому я на самом деле не пытался передать 31 в свой вызов AfxBeginThread, и оказалось, что он игнорирует это значение и устанавливает для потока обычный приоритет вместо 15, который я получаю с помощью THREAD_PRIORITY_TIME_CRITICAL.

Обновление: оказалось, что запуск дефрагментации диска — это хороший способ вызвать много задержек потоков. Даже запуск процесса в REALTIME_PRIORITY_CLASS и поток пульса в THREAD_PRIORITY_TIME_CRITICAL (уровень 31), похоже, не помогает. Следующее, что нужно попробовать, это вызвать AvSetMmThreadCharacteristics("Pro Audio")

Обновление: планирование потока пульса как "Pro Audio" работает для повышения приоритета потока выше 15 (базовый = 1, динамический = 24), но это не похоже чтобы иметь какое-либо реальное значение при выполнении дефрагментации. Я смог сопоставить многие замедления с дефрагментацией диска, поэтому отключил еженедельное сканирование. Все еще не можем объяснить некоторые задержки, поэтому мы собираемся увеличить время ожидания сторожевого таймера до 5-10 секунд.

5
задан jacobsee 9 December 2014 в 16:37
поделиться