![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#11 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,369
|
![]()
Перед вызовом PlaySound ставите флажок.
После завершения PlaySound снимаете флажок. Все это синхронно, в отдельном потоке. Я все еще не понимаю сути проблемы - если вам надо запустить новый звук, просто вызовите PlaySound еще раз. Если наоборот, не надо прерывать - тогда используйте флаг + синхронный вызов. |
![]() |
![]() |
![]() |
#12 |
Заблокирован
Регистрация: 17.12.2018
Сообщений: 514
|
![]()
Каждый асинхронный вызов – старт отдельного потока. По-другому асинхронную функцию просто не сделать. Флаг не стоит, я его проверил, поставил. Поставить флаг мгновенно я не могу. Рассмотрим интервал, в течении которого функция уже проверила флаг, но ещё не поставила. В течении этого интервала в другом потоке может произойти что угодно. В том числе, другой поток может проверить флаг. Итак:
1. Главный поток создал второй поток, вызвав функцию say1. 3. Функция say1 проверила флаг. 3. Флаг оказался сброшен, функция say собралась заговорить и зашла в ветвь. 4. Главный поток создал третий поток, вызвав функцию say2. 5. Функция say2 проверила флаг, он оказался сброшен, функция say2 собралась заговорить и зашла в ветвь. 6. Функция say1 установила флаг. 7. Функция say2 установила флаг ещё раз. Это ни на что не влияет, так как там не инкремент байта, а присваивание булевого значения. 8. Функция say1 загрузила все нужные ей элементы словаря. 9. Функция say2 загрузила все нужные ей элементы словаря. 10. Функция say1 залочила все нужные ей элементы словаря. 11. Функция say2 залочила все нужные ей элементы словаря. 12. Функция say1 начала говорить. 13. Функция say2 начала говорить. 14. Функция say1 закончила говорить. 15. Функция say2 закончила говорить. 16. Функция say1 разлочила все элементы словаря, которые были ей нужны и завершилась. 17. Функция say2 разлочила все элементы словаря, которые были ей нужны и завершилась. А надо так: 1. Главный поток создал второй поток, вызвав функцию say1. 2. Функция say1 собралась заговорить, зашла в ветвь. 3. Главный поток создал третий поток, вызвав функцию say2. 4. Функция say2 задержалась на время до двух секунд. Если за 2 секунды флаг не сбрасывался, то функция say2. завершилась, возможно, перед этим выведя текстовое сообщение на экран. 6. Функция say1 загрузила все нужные ей элементы словаря. 7. Функция say1 залочила все нужные ей элементы словаря. 8. Функция say1 начала говорить. 9. Функция say1 закончила говорить. 10. Функция say1 разлочила все элементы словаря, которые были ей нужны, и завершилась. 12. Если функция say1 уложилась в 2 секунды, то: 12.1. Функция say2 вышла из цикла ожидания, собралась заговорить и зашла в ветвь. 12.2. Функция say2 загрузила все нужные ей элементы словаря. 12.3. Функция say2 залочила все нужные ей элементы словаря. 12.4. Функция say2 начала заговорить. 12.5. Функция say2 закончила заговорить. 12.6. Функция say2 разлочила все элементы словаря, которые были ей нужны, и завершилась. Или так: 1. Главный поток создал второй поток, вызвав функцию say1. 2. Функция say1 собралась заговорить, зашла в ветвь. 3. Функция say1 загрузила все нужные ей элементы словаря. 4. Функция say1 залочила все нужные ей элементы словаря. 5. Функция say1 начала говорить. 6. Главный поток создал третий поток, вызвав функцию say2. 7. Функция say2 задержалась на время до двух секунд. Если за 2 секунды флаг не сбрасывался, то функция say2. завершилась, возможно, перед этим выведя текстовое сообщение на экран. 8. Функция say1 разлочила все элементы словаря, которые были ей нужны, и завершилась. 9. Если функция say1 уложилась в 2 секунды, то: 10.1. Функция say2 вышла из цикла ожидания, собралась заговорить и зашла в ветвь. 10.2. Функция say2 загрузила все нужные ей элементы словаря. 10.3. Функция say2 залочила все нужные ей элементы словаря. 10.4. Функция say2 начала заговорить. 10.5. Функция say2 закончила заговорить. 10.6. Функция say2 разлочила все элементы словаря, которые были ей нужны, и завершилась. Требуется гарантировать, что будет один из этих вариантов. Я могу использовать критическую секцию, но если say1 уже в ней, то say2 будет задержана на любое время и гарантированно заговорит, когда say1 выйдет из секции. А надо задержать на ограниченное время и завершиться, если другой поток не уложился по времени. Последний раз редактировалось taras-proger77; 07.06.2019 в 14:26. |
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
как узнать, когда остановится playsound | TUberwer | Мультимедиа в Delphi | 5 | 15.08.2013 22:36 |
Как узнать какой из Image виден в данный момент? | Volkogriz | Общие вопросы Delphi | 2 | 09.12.2012 10:56 |
Узнать через интернет сколько копий программы запущено в данный момент. | Casper-SC | Общие вопросы .NET | 6 | 23.09.2010 18:10 |
Как програмно узнать какая директория [папка] в данный момент открыта? | dolphin705 | Общие вопросы Delphi | 13 | 08.04.2009 21:30 |
Как узнать какие данные в данный момент печатает принтер? | progan | Общие вопросы Delphi | 0 | 24.12.2008 09:34 |