![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
gpepsi |
![]()
Сообщение
#1
|
Студент ![]() Группа: Участник Сообщений: 73 Регистрация: 31.3.2010 Пользователь №: 1582 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Использовал сигнал из потока. Обработчик слота находился в другом потоке.
Заметил, что сигнал не доходит. Поставил Qt::DirectConnection. Сигнал стал приходить. Но читая про него обнаружил еще и Qt::BlockingQueuedConnection, про который было написано, что он предназначен для работы из различных потоков и так же блокирует очередь. Но есть коментарий, что этот сигнал может привести к deadlock-у. В чем тогда различае между ними, если оба блокируют, но только второй может зависнуть. |
|
|
Litkevich Yuriy |
![]()
Сообщение
#2
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
при работе между потоками нужно использовать Авто (AutoConnection) или Через Очередь (QueuedConnection)
|
|
|
gpepsi |
![]()
Сообщение
#3
|
Студент ![]() Группа: Участник Сообщений: 73 Регистрация: 31.3.2010 Пользователь №: 1582 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
gpepsi |
![]()
Сообщение
#4
|
Студент ![]() Группа: Участник Сообщений: 73 Регистрация: 31.3.2010 Пользователь №: 1582 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
[quote name='gpepsi' date='1.10.2011, 23:58' post='53407']
[quote name='Litkevich Yuriy' post='53406' date='1.10.2011, 23:55']при работе между потоками нужно использовать Авто (AutoConnection) или Через Очередь (QueuedConnection) ну может я что-то не так понял. Пример 1 - хрена лысово:
Пример 2 - работает:
Пример 3 - хрена лысово:
Или я что-то не понял ? |
|
|
MoPDoBoPoT |
![]()
Сообщение
#5
|
Участник ![]() ![]() Группа: Участник Сообщений: 172 Регистрация: 7.5.2009 Из: Москва Пользователь №: 738 Спасибо сказали: 44 раз(а) Репутация: ![]() ![]() ![]() |
Хм, как интересно)
Наверное, дело в том, что для обработки сигналов испускаемых из другого потока (из метода run()) необходим цикл обработки событий (QThread::exec ()). А с соединением Qt::DirectConnection работает, потому что сигнал испускается самим потоком, а он создан в контексте главного потока. |
|
|
gpepsi |
![]()
Сообщение
#6
|
Студент ![]() Группа: Участник Сообщений: 73 Регистрация: 31.3.2010 Пользователь №: 1582 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
Гость_lanz_* |
![]()
Сообщение
#7
|
Гости ![]() |
MoPDoBoPoT все правильно говорит.
|
|
|
Гость_lanz_* |
![]()
Сообщение
#8
|
Гости ![]() |
Прошу прощения, криво отправилось.
MoPDoBoPoT все правильно говорит. Правильный код:
run работает в другом потоке, но объект источник сигнала создан в том же, поэтому DirectConnect работает. Принадлежность к треду свойство объекта, а не фрагмента кода. Не уверен что такое использование правильное, я бы делал:
Правильно запускать в методе run цикл обработки событий. |
|
|
![]() ![]() ![]() |
![]() |
|
Текстовая версия | Сейчас: 21.4.2025, 18:11 |