Russian Qt Forum

Qt => Многопоточное программирование, процессы => Тема начата: YvenTitan от Август 05, 2016, 08:41



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


Название: Re: Передача часто QList между объектами в разных потоках
Отправлено: ssoft от Август 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 );
...
 


Название: Re: Передача часто QList между объектами в разных потоках
Отправлено: YvenTitan от Август 05, 2016, 10:25
Исправил, как вы сказали. Не помогло. Сигнал посылается, а слот по нему не срабатывает. Во вложении то, как я это делал


Название: Re: Передача часто QList между объектами в разных потоках
Отправлено: Igors от Август 05, 2016, 11:15
Делать while/sleep не запрещено, но так Вы обрекаете себя на низкоуровневую синхронизацию и лишаетесь возможности принимать сигналы (нитка не может выйти в свой цикл событий). Если первая объект должен систематически чего-то посылать второму - лучше по таймеру (аттач)


Название: Re: Передача часто QList между объектами в разных потоках
Отправлено: Racheengel от Август 05, 2016, 11:54
А чем мутексы не угодили?


Название: Re: Передача часто QList между объектами в разных потоках
Отправлено: Igors от Август 05, 2016, 12:06
А чем мутексы не угодили?
Все равно надо как-то "передавать", так почему бы не спихнуть все на имплисит шару?


Название: Re: Передача часто QList между объектами в разных потоках
Отправлено: Racheengel от Август 05, 2016, 15:49
А чем мутексы не угодили?
Все равно надо как-то "передавать", так почему бы не спихнуть все на имплисит шару?

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


Название: Re: Передача часто QList между объектами в разных потоках
Отправлено: YvenTitan от Август 05, 2016, 16:19
Igors, спасибо большое, ваш совет помог!


Название: Re: Передача часто QList между объектами в разных потоках
Отправлено: Igors от Август 05, 2016, 16:46
А какая разница? Шара шарой, но защитить то ее тоже надо)
В том-то и дело что нет (при передаче по значению). Как только вторая нитка начнет первое удаление - QList "расшарится"