| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > connect и типы |
| Автор: gpepsi 1.10.2011, 08:54 |
| Использовал сигнал из потока. Обработчик слота находился в другом потоке. Заметил, что сигнал не доходит. Поставил Qt::DirectConnection. Сигнал стал приходить. Но читая про него обнаружил еще и Qt::BlockingQueuedConnection, про который было написано, что он предназначен для работы из различных потоков и так же блокирует очередь. Но есть коментарий, что этот сигнал может привести к deadlock-у. Поставил Qt::BlockingQueuedConnection - вообще перестало приходить. В чем тогда различае между ними, если оба блокируют, но только второй может зависнуть. |
| Автор: bsa 3.10.2011, 00:44 |
| Чтобы сигнал доходил, необходимо чтобы в потоке был EventLoop. Почитай про него в документации по QThread. |
| Автор: bsa 3.10.2011, 23:26 |
| Попробуй добавить thread->moveToThread(thread); сразу после старта потока (в конструктор, например, наследника QThread). |
| Автор: gpepsi 4.10.2011, 08:14 | ||
а что это даст ? |
| Автор: bsa 5.10.2011, 13:58 |
| gpepsi, а ты попробуй. может что-нибудь и даст... |
| Автор: gpepsi 23.10.2011, 11:45 | ||
так и не могу понять принцип работы. В слот добавил
что при moveToThread(this);, что без него отрабатывает assert. Сигнал - Qt::AutoConnection похоже == Qt::QueuedConnection - в этом причина ? P.S. Я так понимаю, что QThread::exec запускает цикл обработки. Это нужно, чтоб доходили сигналы до потока. Тогда можно вызвать quit для завершения потока. А что если поток выполняет очень долгие расчеты (например несколько часов), то как тогда завершить поток ? То есть как в потоковой функции проверять завершение потока, если до exec дело не дошло либо его вообще нет ? P.P.S Или если вызывать quit, то в потоке нужно запустить exec. Как тогда построить код, чтоб потоковый объект обрабатывал сигналы и мог выполнять долгие расчеты ? |
| Автор: Artemon 24.10.2011, 08:59 | ||
Так в этом и есть суть обработки очереди сообщений. Ты сможешь потоку кидать сигналы и он соответственно сможет на них реагировать. Здесь уж придется выбирать, либо с поддержкой сигналов, либо без нее, но при этом метод run не блокируется. |
| Автор: gpepsi 24.10.2011, 09:20 | ||
если я буду поддерживать сигналы, то мне тогда достатточно просто создать объект в потоке и запустить цикл обработки потока ? И слоты его тогда будут обрабатываться в отдельном потоке ? |
| Автор: Artemon 24.10.2011, 11:31 | ||
| Да, должно быть именно так. Для этого нужно не забыть поставить последним параметром сетода connect константу Qt::QueuedConnection. Вот цитата из переведенной документации Qt:
|