Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.06.2019, 13:54   #11
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Перед вызовом PlaySound ставите флажок.
После завершения PlaySound снимаете флажок.
Все это синхронно, в отдельном потоке.
Я все еще не понимаю сути проблемы - если вам надо запустить новый звук, просто вызовите PlaySound еще раз. Если наоборот, не надо прерывать - тогда используйте флаг + синхронный вызов.
waleri вне форума Ответить с цитированием
Старый 07.06.2019, 14:07   #12
taras-proger77
Заблокирован
 
Регистрация: 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.
taras-proger77 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как узнать, когда остановится 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