У меня есть многопоточное приложение DirectShow, которое использует сокеты для передачи аудио в Skype и из него.Он написан на Delphi 6 с использованием набора компонентов DSPACK.Компоненты сокетов, используемые для обмена аудиоданными через Skype, взяты из библиотеки сокетов ICS.Компоненты ICS используют неблокирующие сокеты, которые используют цикл сообщений Windows, чтобы выполнять свою работу, вместо использования блокирующих сокетов, как это делают компоненты Indy или Synapse.У меня есть каждый сокет в своем собственном критическом рабочем потоке в реальном времени.В сообщении о переполнении стека, которое я сделал о сокетах ICS и фоновых потоках, был сделан комментарий о переходе на Indy, чтобы избежать «узкого места» в очереди событий Windows:
Как я могу выдвинуть событие OnDataAvailable () TWSocketв фоновую ветку в моем приложении Delphi 6?
Может кто-нибудь сказать мне, что это такое и какие шаги мне нужно предпринять, чтобы предотвратить / избежать этой проблемы?
Обратите внимание, у меня есть два сокета ICS, которые обрабатывают двунаправленное (дуплексное) соединение для аудио через Skype.Один для отправки аудио в Skype и другой для получения аудио из Skype.У меня аудио буферы установлены на размер, равный 100 миллисекундам аудиоданных.Поэтому данные отправляются 10 раз в секунду в Skype и, наоборот, 10 раз в секунду из Skype.Каждый сокет имеет свой собственный поток, настроенный на критический приоритет в реальном времени для выполнения своей работы.
Причина моего вопроса заключается в следующем.Приложение теперь работает достаточно хорошо.До того, как я исправил ряд ошибок, я бы увидел постепенно увеличивающиеся задержки в аудиопотоках отправки и получения.Теперь я могу работать в течение нескольких минут без каких-либо задержек, слышимых в аудиопотоках, но после этого, и время начала чрезвычайно изменчиво, начинают появляться некоторые небольшие задержки. Я заметил следующие симптомы:
- Если у меня большое количество сообщений OutputDebugString (), задержки происходят через 20-30 секунд, и после этого экспоненциально ухудшаются (быстро ухудшаются).Удаление сообщений OutputDebugString () устраняет проблему:
Как я могу удержать большое количество вызовов OutputDebugString () от деградации моего приложения в Delphi 6 IDE?
Переключение из моего приложения обратно в Delphi IDE приводит к задержке, которая вводится в аудиопотоки.Очевидно, что-то в коммутаторе суммирует работу, и у меня есть код, который отслеживает, как долго удерживается критическая секция, появляется предупреждение о том, что одна из критических секций держалась в течение длительного периода времени (дольше, чем 100 миллисекунд, что, очевидно,проблема).
Примечание. Два потока, которые я использую для отправки строк командных сообщений в Skype и получения статусных и результирующих строк сообщений из Skype, такжеНа основе GetMessage (), поскольку синхронизация с Skype выполняется синхронно с вызовом API Windows SendMessage () с использованием сообщений WM_COPYDATA.
Учитывая частоту доставки аудио, какова вероятность того, что проблемы связаны сWindows "узкое место в очереди событий", или это скорее неэффективность в моей схеме синхронизации потоков?