Russian Qt Forum
Ноябрь 22, 2024, 21:25 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Продумать синхронизацию потоков  (Прочитано 6628 раз)
mezmay
Гость
« : Февраль 22, 2015, 18:02 »

2 потока: GUI и обработки звука. В GUI потоке надо изменять объект фильтра, который потом используется в звуковом потоке для обработки в реальном времени. Любые блокирующие операции применять нельзя в звуковом потоке, так как сразу идут разрывы. Поэтому мьютексы и спинлоки отпадают.
Думаю надо сделать два оъекта-фильтра и два указателя на них (pointer_gui, pointer_sound), которые надо менять местами каждый раз после изменения фильтра в GUI потоке.
Код:
pointer_gui = pFilter_1;
pointer_sound = pFilter_2;
...

pointer_gui->init(/* параметры фильтра */);
swap(pointer_gui, pointer_sound);
Я правильно понимаю? И это по-хорошему надо сделать через QAtomicPointer, как?

Записан
mezmay
Гость
« Ответ #1 : Февраль 22, 2015, 19:23 »

Нет, эта фигня не работает. Вообще смысла нет менять указатели, поток-то работает с объектом. То есть обрабатывается звук, а в этот момент GUI поток перебросил указатели и пишет в тот же объект...
На данный момент сделано так: в звуковой поток передаю параметры фильтра и уже в нём (звуковом потоке) инициализирую объект фильтра. Плюс в том, что надо просто передать значения переменных типа float. Минус - в том что инициализировать приходится в звуковом потоке, где лишние операции не нужны.

То есть полноценной синхронизации сейчас нет - примитивы синхронизации использовать нельзя, события тоже использовать нельзя, т.к. нет доступа к управлению звуковым потоком (звук написан с использованием библиотеки Jack audio connection kit). Пока в голове только один вариант - циклический буфер объектов-фильтров.
« Последнее редактирование: Февраль 22, 2015, 20:07 от mezmay » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Февраль 23, 2015, 12:22 »

Нет, эта фигня не работает. Вообще смысла нет менять указатели, поток-то работает с объектом. То есть обрабатывается звук, а в этот момент GUI поток перебросил указатели и пишет в тот же объект...
А если писать в новый объект и затем перебросить указатели?
Записан
mezmay
Гость
« Ответ #3 : Февраль 23, 2015, 15:55 »

Нет, эта фигня не работает. Вообще смысла нет менять указатели, поток-то работает с объектом. То есть обрабатывается звук, а в этот момент GUI поток перебросил указатели и пишет в тот же объект...
А если писать в новый объект и затем перебросить указатели?
Пробовал делать так, но начинает тормозить (проц довольно слабый) из-за постоянной операции new
Записан
Bepec
Гость
« Ответ #4 : Февраль 23, 2015, 16:00 »

А зачем New постоянно? сделайте 2 объекта. В один пишете, второй читается. Потому тупо меняете местами Улыбающийся
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Февраль 23, 2015, 17:04 »

Пробовал делать так, но начинает тормозить (проц довольно слабый) из-за постоянной операции new
Откуда такая частота? Вообще плохо Вас понял. Есть широко известный прием который иногда называют "фотографией". Есть указатель используемый рабочей ниткой. Другая нитка (часто главная) готовит новые данные и (когда все готово) замещает используемый указатель. Операция замены атомарна. Почему это стандартное решение Вас не устраивает - неясно
Записан
mezmay
Гость
« Ответ #6 : Февраль 23, 2015, 20:39 »

Замена указателей меня не устраивает т.к. ничего не дает. Потому что нужно объекты менять а не просто указатели. Чтобы GUI поток не писал в рабочий объект
Записан
Bepec
Гость
« Ответ #7 : Февраль 23, 2015, 21:08 »

Походу у него проблемы с C++. Улыбающийся
Записан
mezmay
Гость
« Ответ #8 : Февраль 23, 2015, 22:03 »

Ну так помогите разобраться, если видите что я чего-то не понимаю.
В данный момент непонятно: звуковой поток получил нужный указатель и работает с объектом, на который он указывает. В это время gui поток поменял указатели и пишет в тот же объект
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #9 : Февраль 24, 2015, 07:48 »

Ну так помогите разобраться, если видите что я чего-то не понимаю.
В данный момент непонятно: звуковой поток получил нужный указатель и работает с объектом, на который он указывает. В это время gui поток поменял указатели и пишет в тот же объект
Зачем "в тот же" если нужно в другой, а потом подменить. Псевдокод
// gui поток
Код
C++ (Qt)
std::shared_ptr <SoundData> theMainData(new SoundData);  // глобальная переменная
theMainData->Init(...);  // заполняем данные
soundThread.start();  // запускаем звуковой
 
// установка новых данных "на ходу"
void SetNewData( ... )
{
 std::shared_ptr <SoundData> temp(new SoundData); // создаем новые данные
 temp->Init(...);  // заполняем их
 ...
 theMainData = temp;  // устанавливаем новый указатель
}
// Звуковой поток
Код
C++ (Qt)
std::weak_ptr <SoundData> theCurrentData = theMainData; // текущие данные
// работаем с текущими данными theCurrentData
...
// перегружаем данные
theCurrentData = theMainData;
После SetNewData в памяти будут 2 копии данных: новая и старая (с которой еще работает звуковой). Когда звуковой решит что можно заместить данные на новые, он выполнит присваивание (последняя строка), это вызовет удаление старых

Походу у него проблемы с C++. Улыбающийся
А здесь все не так уж просто. Переставить указатели - ума много не надо, но что делать со старым? Ведь удалить его просто так нельзя, он в использовании  
« Последнее редактирование: Февраль 24, 2015, 07:51 от Igors » Записан
mezmay
Гость
« Ответ #10 : Февраль 24, 2015, 08:36 »

В это время gui поток поменял указатели и пишет в тот же объект
В каком случае может быть эта ситуация если я переставляю после записи? Только если за время чтения в звуковом потоке gui поток успеет более одного раза записать?
« Последнее редактирование: Февраль 24, 2015, 09:06 от mezmay » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #11 : Февраль 24, 2015, 09:49 »

В это время gui поток поменял указатели и пишет в тот же объект
В каком случае может быть эта ситуация если я переставляю после записи? Только если за время чтения в звуковом потоке gui поток успеет более одного раза записать?
Да, эта ситуация называется "ABA". Но и без нее, если у Вас структура данных, то просто "перестановка" не будет работать корректно, напр
Код
C++ (Qt)
// звуковой
SoundData * data;
...
if (data->param1 && data->param2) ...
Так может выйти что param1 был считан из "старых" данных, а param2 - уже из "новых". А если главная нитка уже грохнула старые, то вообще вылет. Поэтому юзайте шаред
« Последнее редактирование: Февраль 24, 2015, 09:51 от Igors » Записан
mezmay
Гость
« Ответ #12 : Февраль 24, 2015, 10:57 »

Спасибо, пока все понятно
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.106 секунд. Запросов: 23.