![]() |
|
|
![]()
|
|
| dix75 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 462 Регистрация: 17.7.2007 Репутация: 1 Всего: 1 |
Добрый день!
Нужен совет. Имеется несколько веб-сервисов. Проблема сервисы могут быть недоступны. Необходимо последовательно перебирать сервисы и слал запросы до тех пор пока не получу данные. Наисано базовый класс сервисов, класс заглушка и все реализации сервисов. В написании класса перебирающего сеервисы возникла проблема. Логика следующая - создается поток - в потоке перебираются сервисы если данные получены, поток завершается. Но проблема в том, что сервисы не испускают сигналы, хотя должны. Работа классов сервисов проверена тестами. -------------------- save your mind |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 24 Всего: 196 |
dix75, это стандартная проблема с потоками и сигналами в Qt. Чтобы работали сигналы, нужно сделать moveToThread для всех объектов, кто их генерит.
|
|||
|
||||
| dix75 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 462 Регистрация: 17.7.2007 Репутация: 1 Всего: 1 |
bsa, Так эти объекты создаются внутри потока
-------------------- save your mind |
|||
|
||||
| vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 3 Всего: 56 |
слишком абстрактно описана проблема, помочь при таком описании весьма проблематично.
|
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 24 Всего: 196 |
dix75, внутри потока (run()) или внутри конструктора потока? Конструктор потока запускается из другого потока!
|
|||
|
||||
| dix75 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 462 Регистрация: 17.7.2007 Репутация: 1 Всего: 1 |
bsa,
Внутри run() -------------------- save your mind |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 24 Всего: 196 |
dix75, а кто у них parent? Просто имей в виду, что если парент у них QThread, то это все равно, что создан в другом потоке.
|
|||
|
||||
| dix75 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 462 Регистрация: 17.7.2007 Репутация: 1 Всего: 1 |
bsa,
parent у них QObject; -------------------- save your mind |
|||
|
||||
| Guinness |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 310 Регистрация: 21.6.2009 Где: Зеленоград Репутация: 2 Всего: 10 |
dix75, можно тело функции run посмотреть?
|
|||
|
||||
| dix75 |
|
||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 462 Регистрация: 17.7.2007 Репутация: 1 Всего: 1 |
Выложил всю конструкцию
Да в отладчике пишет что разные треды. И как сделать одним тредом. Это сообщение отредактировал(а) dix75 - 15.4.2014, 14:00 -------------------- save your mind |
||||||||
|
|||||||||
| Guinness |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 310 Регистрация: 21.6.2009 Где: Зеленоград Репутация: 2 Всего: 10 |
dix75, косяк здесь в этой строчке:
Сам QThread находится в другом потоке, не в том, которой запускается методом run(). Нужно просто не передавать в конструктор this. |
|||
|
||||
| dix75 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 462 Регистрация: 17.7.2007 Репутация: 1 Всего: 1 |
Теперь к сути проблемы
Manager не работает -------------------- save your mind |
|||
|
||||
| vinter |
|
||||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 3 Всего: 56 |
блин, ну сколько можно так использовать Qt треды. Почему их никто не использует правильно?
Не проверял, но суть должна быть ясна. Добавлено через 2 минуты и 42 секунды может быть твой Worker находится в потоке чья очередь сообщений в данный момент ожидает чего-то и ты просто не можешь получить сообщение от мэнеджера? |
||||
|
|||||
| dix75 |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 462 Регистрация: 17.7.2007 Репутация: 1 Всего: 1 |
ну во-первых это задокументированная возможность.
см. Qthread. Во вторых твой код тоже не работает -------------------- save your mind |
||||
|
|||||
| vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 3 Всего: 56 |
эта часть документации добавлена после глупой статьи на woboq, автором этой же статьи. Наследовать QThread, чтобы сделать WorkerThread - не правильно. Как с точки зрения ООП, так и с точки зрения тех, кто Qt писал изначально. Не предназначен он для этого. ну код у тебя не мой, моя только идея. Вероятно ты её не так используешь Это сообщение отредактировал(а) vinter - 15.4.2014, 16:21 |
|||
|
||||
| dix75 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 462 Регистрация: 17.7.2007 Репутация: 1 Всего: 1 |
vinter,
Были сипользованы все предложенный Qt способы (до написания просьбы помочь). И еще раз повторю он не работает с асинхронными запросами. Это сообщение отредактировал(а) dix75 - 15.4.2014, 16:34 -------------------- save your mind |
|||
|
||||
| vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 3 Всего: 56 |
dix75, значит ты, что-то делаешь не так. Уу меня QNetworkManager работает нормально.
Собирай минимальный проект и выкладывай тут - посмотрим. |
|||
|
||||
| dix75 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 462 Регистрация: 17.7.2007 Репутация: 1 Всего: 1 |
vinter,
У меня QNetworkManager тоже работает. Не работает он в потоке. -------------------- save your mind |
|||
|
||||
| vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 3 Всего: 56 |
хорошо, у меня он тоже работает в потоке. Я тебе ещё раз повторяю - ты, что-то делаешь не так. Что? Не знаю, выкладывай проект - посмотрим.
|
|||
|
||||
| dix75 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 462 Регистрация: 17.7.2007 Репутация: 1 Всего: 1 |
-------------------- save your mind |
|||
|
||||
| vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 3 Всего: 56 |
|
|||
|
||||
| dix75 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 462 Регистрация: 17.7.2007 Репутация: 1 Всего: 1 |
vinter,
Спасибо работает. Правда ругается что не может создать дочерний объект, т.к он находится в другом потоке. Я так понимаю, тоже самое сделать через QtConcurrentyt Не получится? -------------------- save your mind |
|||
|
||||
| vinter |
|
||||||||||||||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 3 Всего: 56 |
если что-то ругается, значит надо исправить. Ругань это скрытая ошибка.
В таком виде - нет. QtConcurrent не содержит т.н. continuations, таким образом ты можешь получить QFuture и ждать на ней, но ты не можешь задать действии по срабатыванию future и забыть о ней. Так что либо написать свою обёртку, либо жить с сигналами и слотами. Асинхронность "из-коробки" в Qt весьма слабая. Лично я для создания асинхронных интерфейсов в Qt использую следующий метод:
и пример использования:
Если из асинхронного метода надо возвращать значение - используй std::future в связке с std::promise |
||||||||||||||
|
|||||||||||||||
| dix75 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 462 Регистрация: 17.7.2007 Репутация: 1 Всего: 1 |
vinter, Да, спасибо. Надо выделить время и изучить Qt треды. Жаль что его нет.
-------------------- save your mind |
|||
|
||||
![]()
|
| Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |