Недавно я проводил некоторые глубокие проверки синхронизации приложения DirectShow, которое есть в Delphi 6, с использованием компонентов DSPACK.В качестве части моей диагностики я создал класс Critical Section, который добавляет функцию тайм-аута к обычному объекту Critical Section, который есть в большинстве языков программирования Windows.Если время между first Acquire () и last match Release () превышает X миллисекунд, создается исключение.
Первоначально я установилтайм-аут в 10 миллисекунд.Код, который я обернул в критических разделах, довольно быстр, используя в основном перемещения памяти и заполняет большинство операций, содержащихся в защищенных областях.К моему большому удивлению, я получал довольно частые тайм-ауты в казалось бы случайных частях кода.Иногда это происходило в блоке кода, который выполняет итерацию списка буферов и выполняет определенные быстрые операции в последовательности, иногда в крошечных разделах защищенного кода, которые выполняли очистку флага только между вызовами Acquire () и Release ().Единственная закономерность, которую я заметил, - это то, что длительности, обнаруженные при истечении времени ожидания, были сосредоточены на медианном значении около 16 миллисекунд.Очевидно, что в последнем примере вхождения, о котором я упоминал выше, требуется огромное количество времени для установки флага.
Итак, мои вопросы:
1) Возможно ли управление потоками WindowsЗачем достаточно часто (примерно раз в несколько секунд) выключать разблокированный поток и не возвращаться к нему в течение 16 миллисекунд или дольше?
2) Если это разумный сценарий, какие шаги я могу предпринять, чтобы уменьшить это вхождение, и мне следует рассмотреть вопрос о повышении приоритетов моего потока?
3) Если это не разумный сценарий, на что еще мне следует обратить внимание или попробовать в качестве метода анализа для диагностики реальной проблемы?
Примечание. Я работаю в Windows XP наIntel i5 Quad Core с 3 ГБ памяти.Кроме того, причина, по которой мне нужно быть быстрым в этом коде, связана с размером буфера в миллисекундах, который я выбрал в своих графах фильтров DirectShow.Чтобы сохранить минимальную задержку, аудио буферы в моем графике доставляются каждые 50 миллисекунд.Поэтому любая операция, которая занимает значительную долю этого времени, вызывает беспокойство.