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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.06.2019, 08:52   #1
taras-proger77
Заблокирован
 
Регистрация: 17.12.2018
Сообщений: 514
По умолчанию Есть ли такая функция?

Существует ли функция, пытающаяся войти в критическую секцию, которая в случае, если другой поток в неё уже вошёл, не задерживается до освобождения секции и потом входит в неё, а возвращает false, или 0, не входя в секцию, а если никакой поток в данную критическую секцию ещё не вошёл, то входит в секцию и возвращает true, или не 0? Мне нужно ограниченное по времени ожидание завершения другого потока, оба потока разделяют саунд-карту и пока один не закончил говорить, другой говорить не должен, а если другой поток болтает слишком долго, то надо просто завершиться, ничего не сказав. Но если другой поток в самом начале войдёт в секцию, а в конце выйдет из неё, в то обычной EnterCriticalSection будет задержка до LeaveCriticalSection во владеющем секцией потоке, сколько бы это ни заняло времени. Я попробовал входить в секцию только на время проверки и сброса/установки глобального флага. Но так потоки иногда начинают говорить в паузах между элементами словаря друг друга. За непосредственное произношение отвечает синхронная PlaySound, поэтому сами звуки не смешиваются, но между вызовами PlaySound потоки вклиниваются, хотя флаг ставится только перед всем предложением и первым вызовом PlaySound отдельно взятым потоком, а сбрасывается только после полного произнесения всего предложения, после того, как PlaySound последний раз вернёт управление отдельно взятому потоку.
Код:
EnterCriticalSection(&SoundCriticalSection);
    if (SoundFlag)
    {
     LeaveCriticalSection(&SoundCriticalSection);
     Start=DoubleTime();
     do
     {
      EnterCriticalSection(&SoundCriticalSection);
      Flag=!SoundFlag;
      Time=DoubleTime();
      LeaveCriticalSection(&SoundCriticalSection);
     } while ((!Flag)&&(((Time-Start))<200.0));
    }
    else
    {
     SoundFlag=true;
     Flag=true;
     LeaveCriticalSection(&SoundCriticalSection);
    }
    EnterCriticalSection(&SoundCriticalSection);
    if (Flag)
    {
     SoundFlag=true;
     LeaveCriticalSection(&SoundCriticalSection);
     ...
     EnterCriticalSection(&SoundCriticalSection);
     SoundFlag=false;
     LeaveCriticalSection(&SoundCriticalSection);
    }
    else
    {
     LeaveCriticalSection(&SoundCriticalSection);
    }
, flag – локальная автоматическая переменная функтора потока, SoundFlag – глобальный флаг. Все потоки разделяют общий функтор (не функцию).
taras-proger77 вне форума Ответить с цитированием
Старый 21.06.2019, 08:55   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Цитата:
Сообщение от taras-proger77 Посмотреть сообщение
пытающаяся войти в критическую секцию
TryEnterCriticalSection()

Сделайте один поток для работы со звуком и к нему приделайте очередь.

Если очень хочется с таймаутом - тогда только через мьютекс.
waleri на форуме Ответить с цитированием
Старый 21.06.2019, 09:16   #3
taras-proger77
Заблокирован
 
Регистрация: 17.12.2018
Сообщений: 514
По умолчанию

Спасибо.
Цитата:
Сообщение от waleri Посмотреть сообщение
Если очень хочется с таймаутом - тогда только через мьютекс.
Да нет, получилось с критической секцией. Обычный цикл ожидания. Но раньше если ожидало два потока, то болтать начинали оба, вклиниваясь в речь друг друга.
taras-proger77 вне форума Ответить с цитированием
Старый 21.06.2019, 09:17   #4
taras-proger77
Заблокирован
 
Регистрация: 17.12.2018
Сообщений: 514
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Сделайте один поток для работы со звуком и к нему приделайте очередь.
Энто как?
taras-proger77 вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
есть такая тема doc91 Фриланс 2 18.05.2011 21:54
Есть ли такая программа misher Софт 11 21.04.2011 21:14
Есть ли функция такая? (Цвет пиксела) YYY Win Api 2 15.11.2009 21:40
Есть ли в Word'е такая функция? чебургатор Microsoft Office Word 6 24.08.2009 23:07
Есть ли такая функция в Паскале?..... maljoha Помощь студентам 2 30.04.2008 13:09