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

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

Страниц: 1 2 [3] 4 5   Вниз
  Печать  
Автор Тема: MoveToThread (все-таки хочется понять ..)  (Прочитано 47906 раз)
mutineer
Гость
« Ответ #30 : Март 20, 2012, 15:03 »

Разве тут не этот случай рассматривают?
Напугал старика. Улыбающийся
А причем здесь очередь сообщений, если здесь соединение будет DirectConnect? Улыбающийся

А причем тут тип коннекта? deleteLater() не удаляет же, а постит event удаления в eventLoop. А eventLoop уже закончился и до этого event'a не дойдет и объект не удалит
Записан
Bepec
Гость
« Ответ #31 : Март 20, 2012, 15:05 »

Таки дык. То есть пришли к мнению, что поток с конструктором moveToThread ничего плохого не может сделать, если не считать из пальца выдуманных ситуаций и непродуманной архитектуры?
Записан
BRE
Гость
« Ответ #32 : Март 20, 2012, 15:05 »

А причем тут тип коннекта? deleteLater() не удаляет же, а постит event удаления в eventLoop. А eventLoop уже закончился и до этого event'a не дойдет и объект не удалит
Точно-точно. Спешу.
Записан
Странник
Гость
« Ответ #33 : Март 20, 2012, 15:14 »

Странник, ты же вумный - поясни в чём "плохость данного метода". И да, можно конкретики аля "делаем вот так, падает допустим через 4 часа".
просто потому, что такое решение создает проблемы на пустом месте и менее универсально. возникает два противоречивых требования: с одной стороны, объект QThread, живущий в потоке, хорошо бы уничтожить до завершения потока, но с другой стороны, прежде чем уничтожить QThread мы должны завершить работу потока, прервав цикл обработки событий через QThread::exit(). как правильно завершить работу потока и удалить объект QThread в этом случае? и вы начинаете ломать себе мозг, чтобы не наступить на грабли, которые сами же разложили.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #34 : Март 20, 2012, 15:22 »

Таки дык. То есть пришли к мнению, что поток с конструктором moveToThread ничего плохого не может сделать, если не считать из пальца выдуманных ситуаций и непродуманной архитектуры?
Да, вроде разобрались - само по себе moveToThread в конструкторе не есть баг (а то тыкают в нос линками Улыбающийся). Ладно, поехали по архитектуре?

Прошу показать пример/псевдокод где наследование от QThread явно плохо/неудачно.

просто потому, что такое решение создает проблемы на пустом месте и менее универсально. возникает два противоречивых требования: с одной стороны, объект QThread, живущий в потоке, хорошо бы уничтожить до завершения потока, но с другой стороны, прежде чем уничтожить QThread мы должны завершить работу потока, прервав цикл обработки событий через QThread::exit(). как правильно завершить работу потока и удалить объект QThread в этом случае? и вы начинаете ломать себе мозг, чтобы не наступить на грабли, которые сами же разложили.
Нет корректного способа убить нитку (и объект QThread) если она активна (не вышла из run). Наверное Вы имели ввиду что-то другое - тогда поясните
Записан
Bepec
Гость
« Ответ #35 : Март 20, 2012, 15:24 »

Убивать нитки надо самому, а deleteLater() - просто более удобный инструмент, НЕПОДХОДЯЩИЙ в данной ситуации. И таких ситуаций я могу привести много Подмигивающий Он далеко не универсален.
Записан
V1KT0P
Гость
« Ответ #36 : Март 20, 2012, 15:25 »

Что то не лезет ко мне в голову пример при котором наследование от QThread и использовании moveToThread будет ронять сервер.
В моем понимании наследование от QThread является сродни использованию goto. И тем и тем можно спокойно обойтись, но в будущем может привести к ненужным костылям.
Записан
Bepec
Гость
« Ответ #37 : Март 20, 2012, 15:27 »

Виктор а помоему вы чуть чуть суть не улавливаете Улыбающийся

Плохого в этом ничего нет. Ни явного, ни скрытого. Точно так же любой виджет наследуется от QWidget.
Просто создаётся аналог(!) QWidget в другом потоке с необходимым нам набором функций.

Можно разбить его на 2/4/6/8/n+2 более простых элементов, но зачем?
Записан
mutineer
Гость
« Ответ #38 : Март 20, 2012, 15:31 »

Да, вроде разобрались - само по себе moveToThread в конструкторе не есть баг (а то тыкают в нос линками Улыбающийся).

Так вопрос в использовании moveToThread в конструкторе или в использовании конструкций moveToThread(this) и thread->moveToThread(thread) ?
Записан
Bepec
Гость
« Ответ #39 : Март 20, 2012, 15:34 »

Так вопрос в использовании moveToThread в конструкторе или в использовании конструкций moveToThread(this) и thread->moveToThread(thread) ?

Объясните мне разницу mutineer,пожалуйста, между

moveToThread(this)

и

thread->moveToThread(thread)
 

А так вопрос в использовании конструкции <потомок_QThread>.moveToThread(<потомок_QThread>);

Сам в себя, проще говоря.
Записан
mutineer
Гость
« Ответ #40 : Март 20, 2012, 15:36 »

Так вопрос в использовании moveToThread в конструкторе или в использовании конструкций moveToThread(this) и thread->moveToThread(thread) ?

Объясните мне разницу mutineer,пожалуйста, между

moveToThread(this)

и

thread->moveToThread(thread)
 

А так вопрос в использовании конструкции <потомок_QThread>.moveToThread(<потомок_QThread>);

Сам в себя, проще говоря.

Разницы нет, кроме встреченного возгласа на форуме "а я не использую moveToThread(this), я делаю thread->moveToThread(thread)". Написал оба случая, чтобы не придирались подобным образом
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #41 : Март 20, 2012, 15:56 »

Да, вроде разобрались - само по себе moveToThread в конструкторе не есть баг (а то тыкают в нос линками Улыбающийся). Ладно, поехали по архитектуре?

Прошу показать пример/псевдокод где наследование от QThread явно плохо/неудачно.

Нет корректного способа убить нитку (и объект QThread) если она активна (не вышла из run). Наверное Вы имели ввиду что-то другое - тогда поясните

На самом деле, с архитектурной точки зрения - сабклассить тред - это использовать его не по назначению. Если у вас есть разовая операция над небольшими (большими?) данными - используйте конкаррент. Кутред (по идее) надо использовать, если есть асинхронная схема событие-обработчик.
Записан
Bepec
Гость
« Ответ #42 : Март 20, 2012, 15:57 »

Я конечно боюсь вас прерывать... Но многое, если не всё, применяется совершенно неожиданно для разработчиков. Те же "ляпы" новичков, где строка является массивом, long boolем и прочая.
А конкурент... Я его ещё не изучал, ибо нужны были нитки - изучал нитки Улыбающийся
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #43 : Март 20, 2012, 16:07 »

Я конечно боюсь вас прерывать... Но многое, если не всё, применяется совершенно неожиданно для разработчиков. Те же "ляпы" новичков, где строка является массивом, long boolем и прочая.
А конкурент... Я его ещё не изучал, ибо нужны были нитки - изучал нитки Улыбающийся

Может быть вам был нужен конкурент как раз?Улыбающийся
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #44 : Март 20, 2012, 16:12 »

А второй вопрос "чистоты" архитектуры - тред задуман как КОНТЕЙНЕР для потока, место, где разрываются связи парент/чайлд и начинается полностью новый конктекст - ведь QObject не может иметь парентом объект в другом треде. И тред получается "мостом" между двумя иерархиями объектов - в родительском потоке и в дочернем. При этом сам тред принадежит родительскому потоку - тк именно он "должен" знать когда стартовать/стопать и удалять тред. И получается не очень логично - мы создаем и удаляем тред из родительского потока, а метод thread() с этим потоком не совпадает. Как-то так, извиняюсь за сумбурность:)
Мне кажется QThread просто (ну или по крайней мере в первую очередь) - это удобный класс для запуска ниток. Мы можем использовать его как контейнер или нет. Да, нитка стартует из другой (обычно главной) но зачем нам категорично утверждать ее "принадлежность"? Напр естественная/популярная схема:

- создал нитку и втулил moveToThread
- нитка создает свои объекты (в конструкторе или др местах) и удаляет их в деструкторе. Сигналы работают как надо (через eventLoop нитки)

Др словами нитка как бы "самодостаточна". Повторное использование - дождался завершения, удалил, создал снова - не проблема. Да, я "разорвал связи", да, я не говорю что это лучше чем "выносить воркера". Но чем это плохо? Где ужасные "костыли", "грабли" о которых так много говорится/пишется?  Улыбающийся
Записан
Страниц: 1 2 [3] 4 5   Вверх
  Печать  
 
Перейти в:  


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