• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

MediaPlayer в отд.потоке останавливает осн.поток

  • Автор темы Bazil
  • Дата начала
Статус
Закрыто для дальнейших ответов.
B

Bazil

Есть задача: Организовать последовательное воспроизведение группы wav-файлов в отдельном потоке, чтобы не тормозить на время воспроизведения главный поток программы.

Был создан программный поток (TThread) и в него помещен вызов в цикле MediaPlayer с параметром MediaPlayer1->Wait=true c перебором всех файлов для воспроизведения. Проблема заключается в том, что на время воспроизведения все таймеры главного потока программы останавливаются, и продолжают работу только после окончания воспроизведения wav.
Испробован вариант с MediaPlayer1->Wait=false и с последующей паузой Sleep() длительностью в длину wav-файла. Результат тот же.
При замене вызова MediaPlayer1 на простой вывод значения счетчика Label2->Caption=IntToStr(cnt1); cnt1++; Sleep(2000); все нормально работает.

Подскажите, в чем тут дело, pliz
 
B

Barmutik

Можно попытаться проигрывать функцией sndPlaySound в асинхронном режиме... точно никаких тормозов не будет .. даже если запускать проигрывание в основном потоке
 
B

Bazil

Функции sndPlaySound, PlaySound и MediaPlayer ведут себя одинаково. После множества экспериментов выяснилось, что причиной торможения основного потока программы является вызов функции проигрывания в Thread::Execute c помощью Synchronize(). Причем торможение проявляется независимо от режима (синхронный, асинхронный). При вынесении функции из-под Synchronize() прямо в Execute все проблемы пропали. Осталась только одна: каким образом защититься от одновременного обращения к этой же медиа-функции из основного потока, если Synchronize() для этого использовать нельзя ? Вероятно, единственный метод - вызов sndPlaySound("..",SND_NOSTOP) для проверки занятости драйвера ...
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!