Многопоточность в Qt, Проблемы с QThread |
Здравствуйте, гость ( Вход | Регистрация )
Многопоточность в Qt, Проблемы с QThread |
silart |
4.6.2008, 8:06
Сообщение
#1
|
Студент Группа: Новичок Сообщений: 15 Регистрация: 31.3.2008 Пользователь №: 138 Спасибо сказали: 0 раз(а) Репутация: 0 |
Добрый день! Подскажите пожалуйста, кто работал с QThread, каким образом сделать так, чтобы сигналы объекта обрабатывались пользовательским потоком, а не потоком графического интерфейса. Вот у Шлее есть 2 примера:
Первый:
Второй:
Как сделать так, чтобы слот slotNextValue() обрабатывался потоком MyThread? В примерах этот слот обрабатывается главным потоком. Есть еще функция moveToThread(), но с ней ничего вообще не получается, в слот не попадает ни один поток... |
|
|
ViGOur |
4.6.2008, 8:23
Сообщение
#2
|
Мастер Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: 40 |
Есть замечательное правило, слот выполняется в том потоке, в котором был создан его объект.
Другими словами тебе нужно, чтобы объект слота slotNextValue создавался в потоке MyThread. |
|
|
Litkevich Yuriy |
4.6.2008, 9:18
Сообщение
#3
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
тут почитай: Связь сигналов и слотов между потоками
|
|
|
sploid |
4.6.2008, 14:21
Сообщение
#4
|
Студент Группа: Участник Сообщений: 51 Регистрация: 26.2.2008 Из: Москва Пользователь №: 106 Спасибо сказали: 10 раз(а) Репутация: 1 |
если я правильно понял вопрос, то должно быть так ( не тестил ):
а сигнал finished QThread сам генерит при завершении потока. |
|
|
alexondi |
11.6.2008, 23:03
Сообщение
#5
|
Новичок Группа: Новичок Сообщений: 1 Регистрация: 11.6.2008 Пользователь №: 199 Спасибо сказали: 0 раз(а) Репутация: 0 |
Вообщем ситуация с потоками слотами в них такая.
Для того чтобы поток мог отрабатывать сигналы от других потоков (что одно и то же - обработка сигналов и слотов объектов в которых находятся объекты ) НЕОБХОДИМО: 1. в поток добавить QEventLoop - это основной механизм через который идет передача сообщений QEvent's а сигналы реализованы как раз с помощью них зы можно сделать локальной переменной в методе run а можно и членом класса - на выбор 2. сам поток необходимо поместить сам в себя т.е. сделать в конструкторе this->moveToThread(this); 3. реализовать м методе run что-то вроде этого
ВСЕ! Теперь все слоты данного потока (а также всех объектов для которых будет вызван метод moveToThread(ref_THREAD) будут выполняться в этом потоке а не в основном. Сам поток тоже может иметь и сигналы и слоты Сообщение отредактировал Litkevich Yuriy - 12.6.2008, 3:32
Причина редактирования: для наглядности используйте тэг code=cpp
|
|
|
AD |
16.6.2008, 9:59
Сообщение
#6
|
Профессионал Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: 17 |
Есть небольшой вопросик на счет QEventLoop! Прочитал про этот класс в хелпе и не понял его предназначения, можете пояснить своими словами, пожалуйста? Предназначен обработки в цикле событий или что?
|
|
|
Litkevich Yuriy |
16.6.2008, 11:01
Сообщение
#7
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
Предназначен обработки в цикле событий или что? Ну если всего лишь перевести вступление: Цитата The QEventLoop class provides a means of entering and leaving an event loop то получится: Цитата QEventLoop класс предоставляет средства входа и выхода в цикл событий читая далее: Цитата В любое время вы можете создать объект QEventLoop и вызвать exec() для него, чтобы запустить локальный цикл событий.
|
|
|
AD |
16.6.2008, 11:18
Сообщение
#8
|
Профессионал Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: 17 |
Ну если всего лишь перевести вступление: Цитата The QEventLoop class provides a means of entering and leaving an event loop то получится: Цитата QEventLoop класс предоставляет средства входа и выхода в цикл событий читая далее: Цитата В любое время вы можете создать объект QEventLoop и вызвать exec() для него, чтобы запустить локальный цикл событий. Я не очень понимаю цели этого цикла событий! Зачем он нужен? Можно объяснить на том, примере, что приведен выше? Перевод я догадался сделать! |
|
|
void* |
16.6.2008, 14:15
Сообщение
#9
|
Программист-самоучка Группа: Участник Сообщений: 429 Регистрация: 4.6.2008 Пользователь №: 193 Спасибо сказали: 28 раз(а) Репутация: 3 |
я особо не читал, но по моему мнению этот класс служит для организации циклов событий, управления ими, т.е. можно вообще например, выключить события и, например, при нажатии на клавишу ничего не будет происходить. Но это лишь мое мнение, точно не знаю
|
|
|
Текстовая версия | Сейчас: 2.12.2024, 17:48 |