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

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

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


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

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

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

Существует ли функция, пытающаяся войти в критическую секцию, которая в случае, если другой поток в неё уже вошёл, не задерживается до освобождения секции и потом входит в неё, а возвращает 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, 09:55   #2
waleri
Профессионал
 
Регистрация: 13.07.2012
Адрес: Нижний Новгород
Сообщений: 5,848
Репутация: 1915
По умолчанию

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

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

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

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

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

Опции темы

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

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

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

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


04:15.


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

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