![]() |
|
|
![]()
|
|
| 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 |
|||
|
||||
![]()
|
| Правила форума "С/С++: Кроссплатформенное программирование, 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. |