Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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


Донат для форума - использовать для поднятия настроения себе и модераторам

А ещё здесь можно купить рекламу за 15 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru

Ответ
 
Опции темы
Старый 07.06.2019, 14:54   #11
waleri
Профессионал
 
Регистрация: 13.07.2012
Адрес: Нижний Новгород
Сообщений: 5,825
Репутация: 1843
По умолчанию

Перед вызовом PlaySound ставите флажок.
После завершения PlaySound снимаете флажок.
Все это синхронно, в отдельном потоке.
Я все еще не понимаю сути проблемы - если вам надо запустить новый звук, просто вызовите PlaySound еще раз. Если наоборот, не надо прерывать - тогда используйте флаг + синхронный вызов.
waleri вне форума   Ответить с цитированием
Старый 07.06.2019, 15:07   #12
taras-proger77
Заблокирован
 
Регистрация: 17.12.2018
Сообщений: 352
Репутация: -137
По умолчанию

Каждый асинхронный вызов – старт отдельного потока. По-другому асинхронную функцию просто не сделать. Флаг не стоит, я его проверил, поставил. Поставить флаг мгновенно я не могу. Рассмотрим интервал, в течении которого функция уже проверила флаг, но ещё не поставила. В течении этого интервала в другом потоке может произойти что угодно. В том числе, другой поток может проверить флаг. Итак:
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 в 15:26.
taras-proger77 вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

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


23:20.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.

Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru