![]() |
|
|
![]()
|
|
| gpepsi |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 121 Регистрация: 14.3.2010 Репутация: нет Всего: нет |
Использовал сигнал из потока. Обработчик слота находился в другом потоке.
Заметил, что сигнал не доходит. Поставил Qt::DirectConnection. Сигнал стал приходить. Но читая про него обнаружил еще и Qt::BlockingQueuedConnection, про который было написано, что он предназначен для работы из различных потоков и так же блокирует очередь. Но есть коментарий, что этот сигнал может привести к deadlock-у. Поставил Qt::BlockingQueuedConnection - вообще перестало приходить. В чем тогда различае между ними, если оба блокируют, но только второй может зависнуть. |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 24 Всего: 196 |
Чтобы сигнал доходил, необходимо чтобы в потоке был EventLoop. Почитай про него в документации по QThread.
|
|||
|
||||
| gpepsi |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 121 Регистрация: 14.3.2010 Репутация: нет Всего: нет |
но я не хочу вызывать exec(). Иначе я повисну на нем до окончания работы потока. А я хочу запустить поток и перейти в первичный поток. А созданный пусть крутится и сигналит. |
||||
|
|||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 24 Всего: 196 |
Попробуй добавить thread->moveToThread(thread); сразу после старта потока (в конструктор, например, наследника QThread).
|
|||
|
||||
| gpepsi |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 121 Регистрация: 14.3.2010 Репутация: нет Всего: нет |
||||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 24 Всего: 196 |
gpepsi, а ты попробуй. может что-нибудь и даст...
|
|||
|
||||
| gpepsi |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 121 Регистрация: 14.3.2010 Репутация: нет Всего: нет |
так и не могу понять принцип работы. В слот добавил
что при moveToThread(this);, что без него отрабатывает assert. Сигнал - Qt::AutoConnection похоже == Qt::QueuedConnection - в этом причина ? P.S. Я так понимаю, что QThread::exec запускает цикл обработки. Это нужно, чтоб доходили сигналы до потока. Тогда можно вызвать quit для завершения потока. А что если поток выполняет очень долгие расчеты (например несколько часов), то как тогда завершить поток ? То есть как в потоковой функции проверять завершение потока, если до exec дело не дошло либо его вообще нет ? P.P.S Или если вызывать quit, то в потоке нужно запустить exec. Как тогда построить код, чтоб потоковый объект обрабатывал сигналы и мог выполнять долгие расчеты ? |
|||
|
||||
| Artemon |
|
|||
|
а ты мне нравишься ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1771 Регистрация: 24.2.2004 Где: Челябинск Репутация: 2 Всего: 20 |
Так в этом и есть суть обработки очереди сообщений. Ты сможешь потоку кидать сигналы и он соответственно сможет на них реагировать. Здесь уж придется выбирать, либо с поддержкой сигналов, либо без нее, но при этом метод run не блокируется. -------------------- Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru |
|||
|
||||
| gpepsi |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 121 Регистрация: 14.3.2010 Репутация: нет Всего: нет |
если я буду поддерживать сигналы, то мне тогда достатточно просто создать объект в потоке и запустить цикл обработки потока ? И слоты его тогда будут обрабатываться в отдельном потоке ? |
|||
|
||||
| Artemon |
|
|||
|
а ты мне нравишься ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1771 Регистрация: 24.2.2004 Где: Челябинск Репутация: 2 Всего: 20 |
Да, должно быть именно так. Для этого нужно не забыть поставить последним параметром сетода connect константу Qt::QueuedConnection.
Вот цитата из переведенной документации Qt:
-------------------- Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru |
|||
|
||||
![]()
|
| Правила форума "С/С++: Кроссплатформенное программирование, 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. |