![]() |
|
![]() ![]() ![]() |
|
xbarmaglot |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 149 Регистрация: 28.8.2012 Репутация: нет Всего: нет |
У меня объект создавался в главном потоке и подключались его сигнады к слотам родителя.
Но понадобилось вынести создание объекта в отдельный поток, т.к. занимало много времени. Из вторичного потока, после создания объекта, я его перемещаю в главный поток с помощью сигнала где он и хранится. В слоте я получаю созданный во вторичном потоке QSharedPointer<MyObject>, подключаю сигналы к слотам и сохраняю объект в карте. Но после переноса создания объекта в отдельный поток перестали срабатывать сигналы. Хотя QObject::connect отрабатывает без ошибок. 1.Связано ли это с тем, что объект создавался в отдельном потоке ? 2.Поможет ли мне moveToThread? Просто он выдает отладочное сообщение с ошибкой. 3.Если еще какие способы решения моей проблемы ? |
|||
|
||||
kolesnle |
|
|||
![]() Упертый сишник ![]() Профиль Группа: Участник Сообщений: 93 Регистрация: 22.3.2013 Репутация: нет Всего: нет |
||||
|
||||
math64 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 23 Всего: 72 |
Само создание объекта (конструктор) занимает много времени или или настройка после конструктора?
Объект можно создать в основном потоке, а настроить в отдельном. |
|||
|
||||
Guinness |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 310 Регистрация: 21.6.2009 Где: Зеленоград Репутация: 2 Всего: 10 |
xbarmaglot, Вы поток убили, в котором создавался объект? Сам объект "живой"?
moveToThread выдает ошибку типа: "нельзя выполнить данную операцию, т.к. у объекта уже есть parent"? И как Вы создаете объект в другом потоке? Переопределяете run() у QThread? Или запускаете какой-нибудь асинхронный поток, который по окончании выдает Вам сигнал с параметром в виде созданного объекта? |
|||
|
||||
xbarmaglot |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 149 Регистрация: 28.8.2012 Репутация: нет Всего: нет |
1. Создание объекта занимает много времени
2. Сам объект создается в run 3. У него нет parent 4. После создания посылается сигнал и поток умирает 5. Сам объект остается жить |
|||
|
||||
Guinness |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 310 Регистрация: 21.6.2009 Где: Зеленоград Репутация: 2 Всего: 10 |
Точно? Просто Вы создали объект в другом потоке, поток убили, каким образом он должен остаться живым? Тогда другой вопрос:
Что за ошибка, приведите, пожалуйста, текст сообщения. Подумайте над вариантом, который предложил math64: Т.е. операцию, занимающую много времени, из конструктора перенести в фукнцию init(), к примеру. Это сообщение отредактировал(а) Guinness - 23.4.2013, 10:11 |
|||
|
||||
xbarmaglot |
|
||||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 149 Регистрация: 28.8.2012 Репутация: нет Всего: нет |
ну и что. parent-а нет, а создан он на куче
не получается. В потоке определяются данные, которые необходимы для создания объекта. |
||||||
|
|||||||
Guinness |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 310 Регистрация: 21.6.2009 Где: Зеленоград Репутация: 2 Всего: 10 |
Возможно ошибка кроется в следующем (http://qt-project.org/doc/qt-4.8/qobject.html#moveToThread):
Это сообщение отредактировал(а) Guinness - 24.4.2013, 11:21 |
||||
|
|||||
xbarmaglot |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 149 Регистрация: 28.8.2012 Репутация: нет Всего: нет |
А что делать-то. Сам объект создается в run. Я хочу положить его в main-поток как в документации
|
|||
|
||||
Guinness |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 310 Регистрация: 21.6.2009 Где: Зеленоград Репутация: 2 Всего: 10 |
Я так понимаю, это нужно делать в самом run(). Вы же вроде делаете moveToThread(), в обработчике сигнала, который находится в главном потоке.
|
|||
|
||||
xbarmaglot |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 149 Регистрация: 28.8.2012 Репутация: нет Всего: нет |
||||
|
||||
Guinness |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 310 Регистрация: 21.6.2009 Где: Зеленоград Репутация: 2 Всего: 10 |
||||
|
||||
xbarmaglot |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 149 Регистрация: 28.8.2012 Репутация: нет Всего: нет |
Guinness, спасибо
Добавлено через 1 минуту и 25 секунд только конечно криво как-то. что если сигнал подписан на несколько слотов, которые в разных потоках ![]() |
|||
|
||||
Guinness |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 310 Регистрация: 21.6.2009 Где: Зеленоград Репутация: 2 Всего: 10 |
В смысле несколько слотов ожидают один сигнал? Ну вот видимо поэтому так и сделали с moveToThread(). Если каждый поток будет перемещать объект в свой поток, то в итоге будет неопределнность, где же он все таки находится.) |
|||
|
||||
math64 |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 23 Всего: 72 |
Это почти всегда можно сделать. Например, посмотрите, как устроены объекты Qt: есть класс, наследуемый от QObject, и класс XXXPrivate:
Таким образом, объект XXX создаётся быстро. Но работать с ним можно будет после вызова init(), который создааст XXXPrivate. init можно вызвать из другого потока. XXXPrivate не наследуется от QObject и его переность в основной поток не требуется. Это сообщение отредактировал(а) math64 - 24.4.2013, 12:52 |
||||
|
|||||
![]() ![]() ![]() |
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |