Поиск:

Ответ в темуСоздание новой темы Создание опроса
> connect и типы 
:(
    Опции темы
gpepsi
Дата 1.10.2011, 08:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 121
Регистрация: 14.3.2010

Репутация: нет
Всего: нет



Использовал сигнал из потока. Обработчик слота находился в другом потоке.
Заметил, что сигнал не доходит.

Поставил Qt::DirectConnection. Сигнал стал приходить.
Но читая про него обнаружил еще и Qt::BlockingQueuedConnection, про который было написано, что он предназначен для
работы из различных потоков и так же блокирует очередь. Но есть коментарий, что этот сигнал может привести
к deadlock-у.

Поставил Qt::BlockingQueuedConnection - вообще перестало приходить.

В чем тогда различае между ними, если оба блокируют, но только второй может зависнуть. 
PM MAIL   Вверх
bsa
Дата 3.10.2011, 00:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 24
Всего: 196



Чтобы сигнал доходил, необходимо чтобы в потоке был EventLoop. Почитай про него в документации по QThread.
PM   Вверх
gpepsi
Дата 3.10.2011, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 121
Регистрация: 14.3.2010

Репутация: нет
Всего: нет



Цитата(bsa @  3.10.2011,  00:44 Найти цитируемый пост)
Чтобы сигнал доходил, необходимо чтобы в потоке был EventLoop. Почитай про него в документации по QThread. 


Код

You can start the event loop by calling exec(); you can stop it by calling exit() or quit().


но я не хочу вызывать exec(). Иначе я повисну на нем до окончания работы потока.
А я хочу запустить поток и перейти в первичный поток. А созданный пусть крутится и сигналит.
PM MAIL   Вверх
bsa
Дата 3.10.2011, 23:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 24
Всего: 196



Попробуй добавить thread->moveToThread(thread); сразу после старта потока (в конструктор, например, наследника QThread).
PM   Вверх
gpepsi
Дата 4.10.2011, 08:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 121
Регистрация: 14.3.2010

Репутация: нет
Всего: нет



Цитата(bsa @  3.10.2011,  23:26 Найти цитируемый пост)
Попробуй добавить thread->moveToThread(thread); сразу после старта потока (в конструктор, например, наследника QThread). 

а что это даст ?
PM MAIL   Вверх
bsa
Дата 5.10.2011, 13:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 24
Всего: 196



gpepsi, а ты попробуй. может что-нибудь и даст...
PM   Вверх
gpepsi
Дата 23.10.2011, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 121
Регистрация: 14.3.2010

Репутация: нет
Всего: нет



Цитата(bsa @  5.10.2011,  13:58 Найти цитируемый пост)
gpepsi, а ты попробуй. может что-нибудь и даст... 

так и не могу понять принцип работы.
В слот добавил
Код

Q_ASSERT(QThread::currentThreadId() != qApp->thread()->currentThreadId());


что при moveToThread(this);, что без него отрабатывает assert. Сигнал - Qt::AutoConnection похоже == Qt::QueuedConnection - в этом причина ?

P.S. Я так понимаю, что QThread::exec запускает цикл обработки. Это нужно, чтоб доходили сигналы до потока. Тогда можно вызвать quit для 
завершения потока. А что если поток выполняет очень долгие расчеты (например несколько часов), то как тогда завершить поток ?
То есть как в потоковой функции проверять завершение потока, если до exec дело не дошло либо его вообще нет ?

P.P.S Или если вызывать quit, то в потоке нужно запустить exec. Как тогда построить код, чтоб потоковый объект обрабатывал сигналы и
мог выполнять долгие расчеты ?
PM MAIL   Вверх
Artemon
Дата 24.10.2011, 08:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а ты мне нравишься
***


Профиль
Группа: Завсегдатай
Сообщений: 1771
Регистрация: 24.2.2004
Где: Челябинск

Репутация: 2
Всего: 20



Цитата(gpepsi @  3.10.2011,  16:30 Найти цитируемый пост)
но я не хочу вызывать exec(). Иначе я повисну на нем до окончания работы потока.

Так в этом и есть суть обработки очереди сообщений. Ты сможешь потоку кидать сигналы и он соответственно сможет на них реагировать.
Здесь уж придется выбирать, либо с поддержкой сигналов, либо без нее, но при этом метод run не блокируется.


--------------------
Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru
PM MAIL   Вверх
gpepsi
Дата 24.10.2011, 09:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 121
Регистрация: 14.3.2010

Репутация: нет
Всего: нет



Цитата(Artemon @  24.10.2011,  08:59 Найти цитируемый пост)
Так в этом и есть суть обработки очереди сообщений. Ты сможешь потоку кидать сигналы и он соответственно сможет на них реагировать.Здесь уж придется выбирать, либо с поддержкой сигналов, либо без нее, но при этом метод run не блокируется.

если я буду поддерживать сигналы, то мне тогда достатточно просто создать объект в потоке и запустить цикл обработки потока ?
И слоты его тогда будут обрабатываться в отдельном потоке ?
PM MAIL   Вверх
Artemon
Дата 24.10.2011, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а ты мне нравишься
***


Профиль
Группа: Завсегдатай
Сообщений: 1771
Регистрация: 24.2.2004
Где: Челябинск

Репутация: 2
Всего: 20



Да, должно быть именно так. Для этого нужно не забыть поставить последним параметром сетода connect константу Qt::QueuedConnection.

Вот цитата из переведенной документации Qt:

Цитата

С постановкой сигналов в очередь - слот выполняется, когда контроль возвращается в цикл обработки сообщений потока, которому принадлежит объект. Слот выполняется в потоке, в котором проживает объект-приемник.



--------------------
Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0471 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.