Russian Qt Forum
Ноябрь 22, 2024, 17:24
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Многопоточное программирование, процессы
>
Очереди, самодельные сигналы
Страниц:
1
2
[
3
]
4
5
...
8
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Очереди, самодельные сигналы (Прочитано 77319 раз)
galilley
Гость
Re: Очереди, самодельные сигналы
«
Ответ #30 :
Август 12, 2010, 12:45 »
Цитата: Igors от Август 12, 2010, 12:05
Самый простой способ: запустить нитку, она начнет крутить свой eventLoop. Когда для нитки есть работа - послать ей сигнал. Нитка выполнит задание, вернет результаты (также через сигнал) и опять уйдет в eventLoop. Для этого в Qt все заточено, дополнительные семафоры не нужны. Просто создавайте и связывайте слоты/сигналы
Это всё понятно, но мне как раз нужда была синхронность, чтобы я мог, например, послать задание во вторичный поток, потом ещё что-нить сделать по ходу в первичном, потом дождаться ответа и выполнять программу дальше.
Записан
Авварон
Джедай : наставник для всех
Offline
Сообщений: 3260
Re: Очереди, самодельные сигналы
«
Ответ #31 :
Август 12, 2010, 12:48 »
это асинхронность...
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Очереди, самодельные сигналы
«
Ответ #32 :
Август 12, 2010, 12:53 »
Цитата: labview от Август 12, 2010, 12:37
Но насколько я понял event loop всегда относится к главному потоку и в Qthread не поддерживается.
Или я ошибаюсь?
Ошибаетесь. Метод exec() (он стоит в run() по умолчанию) запускает eventLoop этой нитки
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Очереди, самодельные сигналы
«
Ответ #33 :
Август 12, 2010, 13:02 »
Цитата: galilley от Август 12, 2010, 12:45
Это всё понятно, но мне как раз нужда была синхронность, чтобы я мог, например, послать задание во вторичный поток, потом ещё что-нить сделать по ходу в первичном, потом дождаться ответа и выполнять программу дальше.
А Вас никто не заставляет ждать пока задание выполнится. Делайте коннект QueuedConnection и управление вернется после того как задание помещено в очередь нитки. А хотите ждать - используйте BlockingQueuedConnection
Записан
labview
Гость
Re: Очереди, самодельные сигналы
«
Ответ #34 :
Август 12, 2010, 13:04 »
Цитата: Igors от Август 12, 2010, 12:53
Цитата: labview от Август 12, 2010, 12:37
Но насколько я понял event loop всегда относится к главному потоку и в Qthread не поддерживается.
Или я ошибаюсь?
Ошибаетесь. Метод exec() (он стоит в run() по умолчанию) запускает eventLoop этой нитки
Да, я попутал, где то прочитал, что в Qt за User Interface всегда отвечает Main, и спутал это с за Event Loop всегда отвечает Main.
То есть в нитях нельзя создавать свои пользовательские окна.
Да, я согласен с тем, что система сигналов и слотов реализована достаточно хорошо. Но мне бы хотелось иметь прямой доступ к Thread, а не через его Event Loop, понимаете?
Ещё мне бы хотелось, раз уж такой возможности нет?!, сбрасывать сигналы (то есть делать их недействительными), если нить их например не может обработать. А так же иметь возможность указать максимальное количество сигналов (размер буфера) для Event Loop определённой нити. И ещё менять сигналы местами или добавлять сигналы не в конец буфера, а в начало например.
Блин, во время написания этого ответа вспомнился момент из камеди клаба:
http://video.google.com/videoplay?docid=4145626155888365960#
Записан
galilley
Гость
Re: Очереди, самодельные сигналы
«
Ответ #35 :
Август 12, 2010, 13:30 »
Цитата: Igors от Август 12, 2010, 13:02
А Вас никто не заставляет ждать пока задание выполнится. Делайте коннект QueuedConnection и управление вернется после того как задание помещено в очередь нитки. А хотите ждать - используйте BlockingQueuedConnection
Но я хотел бы ещё ту же получить ответ из вторичного треда.. хотя да, ответ можно спросить и напрямую, дождавшись пока отработает BlockingQueuedConnection. Надо подумать над этим, спасибо
Цитата: labview от Август 12, 2010, 13:04
Да, я согласен с тем, что система сигналов и слотов реализована достаточно хорошо. Но мне бы хотелось иметь прямой доступ к Thread, а не через его Event Loop, понимаете?
Ещё мне бы хотелось, раз уж такой возможности нет?!, сбрасывать сигналы (то есть делать их недействительными), если нить их например не может обработать. А так же иметь возможность указать максимальное количество сигналов (размер буфера) для Event Loop определённой нити. И ещё менять сигналы местами или добавлять сигналы не в конец буфера, а в начало например.
А что за задача, если не секрет? Может там надо решать проблему другими способами, или с другого угла.. да и крайне интересны условия, в которых могли возникнуть такие потребности.
«
Последнее редактирование: Август 12, 2010, 13:32 от galilley
»
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Очереди, самодельные сигналы
«
Ответ #36 :
Август 12, 2010, 13:50 »
Цитата: galilley от Август 12, 2010, 13:30
Но я хотел бы ещё ту же получить ответ из вторичного треда.. хотя да, ответ можно спросить и напрямую, дождавшись пока отработает BlockingQueuedConnection.
Случай когда надо ждать ответа - довольно редкий. В большинстве случаев ответ посылается из нитки выполнившей задание (тоже сигналом) и принимается в eventLoop главной (или др) нитки. Др. словами гораздо удобнее "ждать с пользой" в eventLoop
Записан
BRE
Гость
Re: Очереди, самодельные сигналы
«
Ответ #37 :
Август 12, 2010, 14:00 »
IMHO стоит взглянуть на QRunnable + QThreadPool.
eventloop в простаивающей нитке все равно кушает процессор и чем больше таких ниток, тем больше кушает.
Записан
labview
Гость
Re: Очереди, самодельные сигналы
«
Ответ #38 :
Август 12, 2010, 14:10 »
Цитата: galilley от Август 12, 2010, 13:30
А что за задача, если не секрет? Может там надо решать проблему другими способами, или с другого угла.. да и крайне интересны условия, в которых могли возникнуть такие потребности.
Ну во первых я не очень понимаю зачем каждой нити свой Event Loop, то есть каждая нить состоит из двух потоков - Event Loop + сам цикл нити. Наверняка как то можно передавать данные напрямую и синхронно в цикл нити, не используя Event Loop.
Во вторых нить например должна отправлять данные какому нибудь внешнему прибору. Допустим данные имеют разный приоритет. Для примера команда exit имеет высший приоритет, а если в данный момент в буфере Event Loop уже находятся другие команды низкого приоритета, то мне бы хотелось убрать команды низкого приоритета из буфера сигналов и сразу выполнить сигнал высокого приоритета. Ну или просто всунуть команду высокого приоритета в буфер на первое место, а остальные подождут.
Ну примерно понятно?
Записан
BRE
Гость
Re: Очереди, самодельные сигналы
«
Ответ #39 :
Август 12, 2010, 14:17 »
Сделать свою очередь заданий будет самое то.
Кстати на форуме были темы, где выкладывались готовые рабочие примеры организации таких задач.
Так же можно посмотреть реализацию QRunnable и QThreadPool.
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Очереди, самодельные сигналы
«
Ответ #40 :
Август 12, 2010, 14:26 »
Цитата: labview от Август 12, 2010, 13:04
Да, я согласен с тем, что система сигналов и слотов реализована достаточно хорошо. Но мне бы хотелось иметь прямой доступ к Thread, а не через его Event Loop, понимаете?
Думаю что понимаю
Но, судя по тому что Вы рассказали, никакой необходимости в этом не видно
Цитата: labview от Август 12, 2010, 13:04
Ещё мне бы хотелось, раз уж такой возможности нет?!, сбрасывать сигналы (то есть делать их недействительными), если нить их например не может обработать. А так же иметь возможность указать максимальное количество сигналов (размер буфера) для Event Loop определённой нити. И ещё менять сигналы местами или добавлять сигналы не в конец буфера, а в начало например.
Мне кажется Вы путаете синхронное с асинхронным
Сигнал всего лишь "посылает нитке задание". На посылающей стороне как правило нет выбора - задачи посылаются исполняющей нитке в порядке их поступления. Но исполнитель совсем не обязан следовать тому же порядку. В любой момент он может вызвать processEvents и посмотреть какие еще задачи пришли, прервать выполнение текущей задачи, установить свой порядок выполнения задач и.т.п.
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Очереди, самодельные сигналы
«
Ответ #41 :
Август 12, 2010, 14:33 »
Цитата: BRE от Август 12, 2010, 14:00
eventloop в простаивающей нитке все равно кушает процессор и чем больше таких ниток, тем больше кушает.
Вряд ли. Запускаем любую Qt программу которая открывает UI и ждет ввода пользователя (т.е. стоит на eventLoop). Активность процессора (ов) на нуле.
Записан
BRE
Гость
Re: Очереди, самодельные сигналы
«
Ответ #42 :
Август 12, 2010, 14:38 »
Цитата: Igors от Август 12, 2010, 14:33
Вряд ли. Запускаем любую Qt программу которая открывает UI и ждет ввода пользователя (т.е. стоит на eventLoop). Активность процессора (ов) на нуле.
Что значит вряд ли.
Если посмотреть реализацию, то на каждой итерации, помимо обработки самих событий, происходит еще масса разных действий. И все это будет выполняться во всех таких нитках без всякой нужды.
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Очереди, самодельные сигналы
«
Ответ #43 :
Август 12, 2010, 14:45 »
Цитата: labview от Август 12, 2010, 14:10
Ну во первых я не очень понимаю зачем каждой нити свой Event Loop, то есть каждая нить состоит из двух потоков - Event Loop + сам цикл нити. Наверняка как то можно передавать данные напрямую и синхронно в цикл нити, не используя Event Loop.
Когда ОС запускает нитку, дается ф-ция которую эта нитка начнет выполнять. Как только ф-ция вернет управление - нитка завершена. Qt по умолчанию запускает eventLoop. Вы можете вместо этого сделать свой цикл нитки (обычно не очень удобно), можете войти в eventLoop, выйти, опять войти - как угодно но все в пределах run() нитки.
Стандартная проблема с собственным циклом - нитке нужно ждать пока данных для обработки нет и нужно как-то сниматься с ожидания когда данные пришли. Во многих случаях выходит то же самое что делает eventLoop
Записан
BRE
Гость
Re: Очереди, самодельные сигналы
«
Ответ #44 :
Август 12, 2010, 14:51 »
Цитата: Igors от Август 12, 2010, 14:45
Стандартная проблема с собственным циклом - нитке нужно ждать пока данных для обработки нет и нужно как-то сниматься с ожидания когда данные пришли. Во многих случаях выходит то же самое что делает eventLoop
А в чем эта проблема?
Нитка останавливается на объекте QWaitCondition::wait, когда задание добавляется, то делаем QWaitCondition::wakeOne и одна из ниток просыпается и подхватывает задание.
Записан
Страниц:
1
2
[
3
]
4
5
...
8
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...