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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Передача часто QList между объектами в разных потоках  (Прочитано 6271 раз)
YvenTitan
Самовар
**
Offline Offline

Сообщений: 174


Просмотр профиля
« : Август 05, 2016, 08:41 »

Здравствуйте.
У меня следующая проблема.
Есть два объекта: obj1 и obj2, оба в разных потоках. Из объекта obj1 необходимо часто (в примере раз в 1 мс) передавать список QList<int> в obj2.
Пример во вложении.
Это упрощенный пример. В реальной задаче надо из одного объекта QAbstractTableModel передавать в другой объект QAbstractTableModel список QList<QStringList>. (Это заранее отвечая на вопрос, почему делаю странные действия).
В данный момент программа вылетает, проработав секунд 2-10. Кажется, что дело в синхронизации. Можете подсказать как сделать, чтобы не вылетало? Пробовал синхронизировать - не получилось. Пробовал через QMutex и флаги, но возможно неправильно. Опыта работы с синхронизацией мало. Пишу на Qt4.8.7.
Записан
ssoft
Программист
*****
Offline Offline

Сообщений: 584


Просмотр профиля
« Ответ #1 : Август 05, 2016, 08:52 »

Так вы осуществляете доступ к переменной m_list одновременно из разных потоков в void SecondObject::M_startSecondObject() и void SecondObject::M_copyList(QList<int> list).
Здесь лучше всего организовать передачу списка через сигнал-слот между obj1 и obj2, а не через прямой вызов метода M_copyList. И переменные static не нужно обозначать).

Код
C++ (Qt)
QObject::connect(obj1,SIGNAL(send(QList<int>)), obj2, SLOT(receive(QList<int>)));
 

и осуществить вызов

Код
C++ (Qt)
...
// SecondObject::M_copyList(sendList);
emit send( sendList );
...
 
« Последнее редактирование: Август 05, 2016, 08:54 от ssoft » Записан
YvenTitan
Самовар
**
Offline Offline

Сообщений: 174


Просмотр профиля
« Ответ #2 : Август 05, 2016, 10:25 »

Исправил, как вы сказали. Не помогло. Сигнал посылается, а слот по нему не срабатывает. Во вложении то, как я это делал
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Август 05, 2016, 11:15 »

Делать while/sleep не запрещено, но так Вы обрекаете себя на низкоуровневую синхронизацию и лишаетесь возможности принимать сигналы (нитка не может выйти в свой цикл событий). Если первая объект должен систематически чего-то посылать второму - лучше по таймеру (аттач)
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #4 : Август 05, 2016, 11:54 »

А чем мутексы не угодили?
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Август 05, 2016, 12:06 »

А чем мутексы не угодили?
Все равно надо как-то "передавать", так почему бы не спихнуть все на имплисит шару?
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #6 : Август 05, 2016, 15:49 »

А чем мутексы не угодили?
Все равно надо как-то "передавать", так почему бы не спихнуть все на имплисит шару?

А какая разница? Шара шарой, но защитить то ее тоже надо)
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
YvenTitan
Самовар
**
Offline Offline

Сообщений: 174


Просмотр профиля
« Ответ #7 : Август 05, 2016, 16:19 »

Igors, спасибо большое, ваш совет помог!
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #8 : Август 05, 2016, 16:46 »

А какая разница? Шара шарой, но защитить то ее тоже надо)
В том-то и дело что нет (при передаче по значению). Как только вторая нитка начнет первое удаление - QList "расшарится"
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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