Russian Qt Forum
Ноябрь 22, 2024, 15:46 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 2 3 [4] 5 6 ... 8   Вниз
  Печать  
Автор Тема: Очереди, самодельные сигналы  (Прочитано 77283 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #45 : Август 12, 2010, 14:52 »

Что значит вряд ли.  Улыбающийся Если посмотреть реализацию, то на каждой итерации, помимо обработки самих событий, происходит еще масса разных действий. И все это будет выполняться во всех таких нитках без всякой нужды.
Согласен, реализация через eventLoop скоростью не блещет. Напр. если каждая задача - обработка 1 точки имеджа, то все уйдет в eventLoop. Но такие скоростные задачи редки, напр. для обработки изображения построчно eventLoop.вполне годится.
Записан
BRE
Гость
« Ответ #46 : Август 12, 2010, 14:59 »

Согласен, реализация через eventLoop скоростью не блещет. Напр. если каждая задача - обработка 1 точки имеджа, то все уйдет в eventLoop. Но такие скоростные задачи редки, напр. для обработки изображения построчно eventLoop.вполне годится.
Конечно, он вполне годиться для задач время выполнения которых значительно больше времени выполнения итерации eventloop. Просто потому, что последним временем можно пренебречь.  Улыбающийся
Но для чего его вообще крутить? Если можно написать свое более эффективное решение, к тому же labview нужны хитрая очередь с приоритетами.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #47 : Август 12, 2010, 15:11 »

А в чем эта проблема?
Нитка останавливается на объекте QWaitCondition::wait, когда задание добавляется, то делаем QWaitCondition::wakeOne и одна из ниток просыпается и подхватывает задание.
Это "выглядит просто"  Улыбающийся Когда вызывается QWaitCondition::wakeOne - нужно быть уверенным что кто-то уже спит на QWaitCondition::wait, а определить это может быть нелегко
Записан
BRE
Гость
« Ответ #48 : Август 12, 2010, 15:14 »

Это "выглядит просто"  Улыбающийся
Да нет, это и реализуется просто.  Улыбающийся

Когда вызывается QWaitCondition::wakeOne - нужно быть уверенным что кто-то уже спит на QWaitCondition::wait, а определить это может быть нелегко
А для чего?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #49 : Август 12, 2010, 15:43 »

Когда вызывается QWaitCondition::wakeOne - нужно быть уверенным что кто-то уже спит на QWaitCondition::wait, а определить это может быть нелегко
А для чего?
Есть задание, данные для нитки-обработчика записаны, вызываем wakeOne. Однако обработчик еще занят предыдущим запросом и wakeOne не имеет эффекта. Обработка закончена, нитка честно ждет на wait, но поезд уже ушел.

Но для чего его вообще крутить? Если можно написать свое более эффективное решение, к тому же labview нужны хитрая очередь с приоритетами.
Очередь все равно формируется обработчиком, сценарий один и тот же, 1 виток цикла выглядит так:

- извлечь все пришедшие сигналы/события  из очереди (удобно из eventLoop)
- поместить все задания во внутреннюю очередь, там рассортировать как надо, удалить ненужные
- заняться первым заданием

Можно сделать и прерывание текущей задачи - ведь пришедшие сигналы доступны в любой момент. Зачем же городить свою внешнюю очередь вместо eventLoop ?
Записан
BRE
Гость
« Ответ #50 : Август 12, 2010, 15:47 »

Есть задание, данные для нитки-обработчика записаны, вызываем wakeOne. Однако обработчик еще занят предыдущим запросом и wakeOne не имеет эффекта. Обработка закончена, нитка честно ждет на wait, но поезд уже ушел.
Ну это как написать.  Подмигивающий

Очередь все равно формируется обработчиком, сценарий один и тот же, 1 виток цикла выглядит так:

- извлечь все пришедшие сигналы/события  из очереди (удобно из eventLoop)
- поместить все задания во внутреннюю очередь, там рассортировать как надо, удалить ненужные
- заняться первым заданием

Можно сделать и прерывание текущей задачи - ведь пришедшие сигналы доступны в любой момент. Зачем же городить свою внешнюю очередь вместо eventLoop ?
Вот это и называется городить огород.  Подмигивающий
Кстати, а как могут быть доступны сигналы, если уже запущена задача (долгий цикл) и обработка событий в связи с этим приостановлена?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #51 : Август 12, 2010, 16:01 »

Кстати, а как могут быть доступны сигналы, если уже запущена задача (долгий цикл) и обработка событий в связи с этим приостановлена?
С помощью вставки в долгие циклы банального processEvents, которая вызовет получение всех пришедших сигналов. Просто когда сигнал получен - не бросаться его обрабатывать
Записан
labview
Гость
« Ответ #52 : Август 12, 2010, 16:16 »

Думаю нашёл что искал:

QWaitCondition::wait
QWaitCondition::wakeOne

Самое то!!! Спасибо, осталось с ними разобраться и всё должно получится, как я хотел.

Буду использовать QList + QWaitCondition вместо сигналов и слотов для коммникации между потоками.

Мне кажется Вы путаете синхронное с асинхронным  Улыбающийся Сигнал всего лишь "посылает нитке задание". На посылающей стороне как правило нет выбора - задачи посылаются исполняющей нитке в порядке их поступления. Но исполнитель совсем не обязан следовать тому же порядку. В любой момент он может вызвать processEvents и посмотреть какие еще задачи пришли, прервать выполнение текущей задачи, установить свой порядок выполнения задач и.т.п.
Думаю не путаю, если получатель будет следовать определённым правилам и всегда исполнять сигналы быстрее чем отправитель их отправляет, то синхронность обеспечивается. Единственная незначительная задержка это переключение между потоками во время отправления сигнала, которая обусловлена осью.
« Последнее редактирование: Август 12, 2010, 16:42 от labview » Записан
labview
Гость
« Ответ #53 : Август 13, 2010, 10:32 »

Скажите пожалуйста это правда что event loop неглавного потока выполняется в главном потоке, а только сам цикл, находящийся в Run() выполняется параллельно главному?
Записан
BRE
Гость
« Ответ #54 : Август 13, 2010, 10:57 »

Скажите пожалуйста это правда что event loop неглавного потока выполняется в главном потоке, а только сам цикл, находящийся в Run() выполняется параллельно главному?
eventloop это и есть сам цикл и работает он в отдельном потоке.
Очередь сообщений тоже создается своя для каждого потока.

[off]Но вопрос зачОтный, читал несколько раз, много думал. Улыбающийся[/off]
Записан
labview
Гость
« Ответ #55 : Август 13, 2010, 11:18 »

Спасибо, не понял  Смеющийся

Event Loop один на все QThreads, но очередь ивентов для каждого разная?
Или у каждого Qthread свой Event Loop и естесственно своя очередь ивентов?

Если я нажимаю на кнопку на интерфейсе и вызываю слот, который был определён в одном из QThread, то функция в слоте выполняется в том же QThread или в другом, одним на все QThread?
Записан
BRE
Гость
« Ответ #56 : Август 13, 2010, 11:22 »

Event Loop один на все QThreads, но очередь ивентов для каждого разная?
Или у каждого Qthread свой Event Loop и естесственно своя очередь ивентов?
Каждая нитка выполняет свой цикл и очередь сообщений у каждого своя.

Если я нажимаю на кнопку на интерфейсе и вызываю слот, который был определён в одном из QThread, то функция в слоте выполняется в том же QThread или в другом, одним на все QThread?
Если объекты находятся в разных потоках (посылающий и принимающий) и используется не DirectConnection, то слот будет отрабатывать в контексте принимающего потока.
Записан
labview
Гость
« Ответ #57 : Август 13, 2010, 11:25 »

Ага, теперь понял, большое спс  Подмигивающий
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #58 : Август 13, 2010, 14:17 »

Каждая нитка выполняет свой цикл и очередь сообщений у каждого своя.
Да, но нужно дополнить: любая нитка (кроме главной) должна вызвать exec(), иначе никакого eventLoop у нее не будет и никаких сообщений/сигналов она принять не сможет.
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #59 : Август 13, 2010, 17:19 »

labview, перефразирую то, что сказал Igors
event loop - цикл обработки событий - это метод exec().


Цитировать
любая нитка (кроме главной)
и главная тоже, если она не вызывает exec(), то и у неё не будет цикла обработки событий
Записан

Юра.
Страниц: 1 2 3 [4] 5 6 ... 8   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.057 секунд. Запросов: 22.