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

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

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: Передача данных между QThread без сигнал-слотов. Безопасно ли так делать?  (Прочитано 18803 раз)
IGHOR
Крякер
****
Offline Offline

Сообщений: 390



Просмотр профиля WWW
« Ответ #15 : Июль 21, 2012, 15:11 »

Как говорил один человек - если в программе больше 20 потоков - это плохая программа Веселый
Да это правда, но в проге есть число потоков только в двое больше чем количество ядер.
И данные будут передаваться от объекта к объекту которые принадлижат разным тредам.
Суть дела не меняется.
« Последнее редактирование: Июль 21, 2012, 15:13 от IGHOR » Записан
Bepec
Гость
« Ответ #16 : Июль 21, 2012, 16:37 »

 Показает язык

Непонятна твоя задача Улыбающийся
Без сигнал слотов хотел бы сделать - я б понял, они медленные. Но ты их используешь.

С сигнал слотами сделал бы - я б понял, ибо сигнал слотовое заточено на межпотоковое соединение. Но ты зачем то отказываешься от них.

Функции, вызываемые с потоком должны быть потокобезопасными - с использованием мутексов и семафоров. Этого у вас пока нет.

PS я пока вашу архитектуру не представляю. Не умещается в моей голове, скажем так - извращённое использование/неисползование сигнал-слотов Улыбающийся
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #17 : Июль 21, 2012, 17:23 »

Ладно уж, пофлудим (в меру)
Функции, вызываемые с потоком должны быть потокобезопасными - с использованием мутексов и семафоров. Этого у вас пока нет.

PS я пока вашу архитектуру не представляю. Не умещается в моей голове, скажем так - извращённое использование/неисползование сигнал-слотов Улыбающийся
Не устаю удивляться насколько точен расчет Qt! Предоставляемые ими средства multi-thrеadng, мягко говоря, "весьма затратны", а по-простому - слабы. Но зато как удобно пулять сигналами из нитки в нитку. И вот уже (робкий) малюсенький шажок в сторону квалифицируется как несомненное извращение Улыбающийся  Хотя человек и не думал покушаться на святую корову - сигналы!

Ну и вообще-то чем меньше мутексов - тем лучше, в этом и состоит искусство multi-theadng
Записан
Bepec
Гость
« Ответ #18 : Июль 21, 2012, 20:00 »

Igors опять разведём баталию? Веселый

Тут человек использует Оо вызов функции, которая в свою очередь вызывает сигнал Оо.

Я тут не вижу явных преимуществ перед просто сигналом Улыбающийся
Записан
IGHOR
Крякер
****
Offline Offline

Сообщений: 390



Просмотр профиля WWW
« Ответ #19 : Июль 21, 2012, 23:08 »

Я тут не вижу явных преимуществ перед просто сигналом Улыбающийся

Представьте что у вас есть 10000 объектов разбросанных в разных тредах.
Вам надо передать данные из одного то в другой само собой методом сигнал слота чтобы не тормозить треды.

Как вы бы это реализовали?
  • Зарание соеденить всевозможные пары этих объектов?
  • Делать connect и disconnect пар объектов при обращениях?
  • Или тем методом которым я сделал (хотя вы его не поняли..)?
Записан
mutineer
Гость
« Ответ #20 : Июль 21, 2012, 23:13 »

Предлагать среди вариантов метод, который непонятен отвечающему - это пять:)
Записан
IGHOR
Крякер
****
Offline Offline

Сообщений: 390



Просмотр профиля WWW
« Ответ #21 : Июль 22, 2012, 03:16 »

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

Сообщений: 11445


Просмотр профиля
« Ответ #22 : Июль 22, 2012, 03:33 »

Представьте что у вас есть 10000 объектов разбросанных в разных тредах.
Вам надо передать данные из одного то в другой само собой методом сигнал слота чтобы не тормозить треды.

Как вы бы это реализовали?
Напр так
Код
C++ (Qt)
ThreadA::ThreadA(ThreadB *thB) : QThread()
{
// threadB=thB;
       connect(this, SIGNAL(MySignal), thB, SLOT(MySlot));
moveToThread(this);
start();
}
Другое дело что обмен через очередь далеко не всегда лучшее решение. Если операции секунда и больше - все отлично, Но частенько бывает что время операции намного меньше постановки в очередь + извлечения из нее. Тогда тормоза и бестолковое сжигание процессорного времени.

Вот с этой точки зрения Ваша схемка имеет смысл. Можно свести к обычной очереди (как сейчас), можно обработать в вызывающей нитке, можно комбинировать так и сяк. При этом решения можно сосредоточить в классе ThreadB
Записан
Bepec
Гость
« Ответ #23 : Июль 22, 2012, 10:22 »

Самое простое решение - поток менеджер, имеющий указатели на все потоки, принимающий сигнал с 2 параметрами - номер потока куда передать и данные. Всё.

Так же вообще можно без сигналов - опять же поток менеджер с thread-safe функцией добавления/передаич данных из своей очереди Веселый
Записан
IGHOR
Крякер
****
Offline Offline

Сообщений: 390



Просмотр профиля WWW
« Ответ #24 : Июль 22, 2012, 13:17 »

Самое простое решение - поток менеджер, имеющий указатели на все потоки, принимающий сигнал с 2 параметрами - номер потока куда передать и данные. Всё.

Да у меня в основном потоке есть указатели на все потоки.
Если соединять Тред=>Главный сигнал слотом то данные передадутся.
Но надо их еще обратно передавать в другой тред и чтобы обойтись без мютексов придется еще делать соединение Главный=>Тред чтобы послать данные в другой тред.
В итоге будет соединений в двое больше чем тредов.

В моем методе есть только одно соединение внутри треда, и одно внутри главного потока.
Выходит если по моему тогда получится соединений столько же сколько тредов + еще одно в главном потоке.
Получается что так делать оптимизированнее.
Записан
Bepec
Гость
« Ответ #25 : Июль 22, 2012, 13:59 »

Не буду спорить далее - то ли ты меня не читаешь, то ли читаешь не до конца, то ли мы разные.

Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #26 : Июль 22, 2012, 17:04 »

В моем методе есть только одно соединение внутри треда, и одно внутри главного потока.
Выходит если по моему тогда получится соединений столько же сколько тредов + еще одно в главном потоке.
Получается что так делать оптимизированнее.
Ну это вряд ли. Число вызовов слотов одно и то же, и скорость одна и та же. Меньше число установленных коннектов, но непонятно чего Вы так боитесь - ну создали нужный коннект хоть в конструкторе - и все.
Записан
IGHOR
Крякер
****
Offline Offline

Сообщений: 390



Просмотр профиля WWW
« Ответ #27 : Июль 25, 2012, 21:02 »

Боялся что могут быть глюки. Но все работает.
В общем зациклился на оптимизации Улыбающийся
Думаю действительно нет разницы.
Всем спасибо за общение Улыбающийся
Иду программировать дальше..
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


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