![]() |
|
|
![]()
|
|
| daemonaz |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 160 Регистрация: 4.5.2008 Репутация: нет Всего: нет |
Мне нужна помощь профи, опыта маловато, хотелось бы понять каким образом организовать обмен обобщениями между потоками: один из них постоянно работает в качестве "сервера", а остальные создаются динамически по надобности, передают свои данные в виде запросов "серверу", и от него же и принимают ответы. В голову приходят всякие сигналы и слоты, однако объекты классов-"клиентов" рождаются и умирают в разное время, к тому же к "серверу" должен быть подключен только один клиент, мысль использовать сигналы-слот на мой взгляд не совсем хорошая. Что можете посоветовать?
|
|||
|
||||
| tzirechnoy |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1173 Регистрация: 30.1.2009 Репутация: 1 Всего: 16 |
TCP/IP или 0mq.
|
|||
|
||||
| daemonaz |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 160 Регистрация: 4.5.2008 Репутация: нет Всего: нет |
tzirechnoy, нет-нет, я использую в "серверном"-потоке обычный ком-порт, который контролирует соединения и осуществляет передачу и прием данных в/из COM-порта в поток-потребитель или клиент по запросу, просто для удобства назвал "сервером" и "клиентом".
|
|||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 48 Всего: 135 |
daemonaz, можно замутить что-нибудь типа такого
только чем это лучше, чем signal/slot'ы - хз Это сообщение отредактировал(а) borisbn - 13.11.2012, 16:09 -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| tzirechnoy |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1173 Регистрация: 30.1.2009 Репутация: 1 Всего: 16 |
Пофиг. Общая память -- это много головной боли. На обмен с её помощью надо переходить только когда ужэ очевидно, что высокоуровневые средства исчерпаны, копирование ограничивает производительность системы и заставляет терять деньги. Да и то жэлательно разработать абстрактный протокол и изолировать его в одном маленьком файле. У Вас вряд ли такая ситуацыя. Так что имеет прямой смысл использовать либо сокеты, либо какую-нибудь известную надстройку над ними (напрм. 0mq). |
|||
|
||||
| daemonaz |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 160 Регистрация: 4.5.2008 Репутация: нет Всего: нет |
borisbn, ну а все таки есть ли попроше способ, который бы позволил гибко подключать любой поток-клиент к потоку-серваку, ну широковещательные события что ли отослать, или какой-то канал создать между ними, а сервер должен перехватить это сообщение по типу сообщения. Хотелось бы чтобы клиентскому потоку пофиг какой серверный поток будет его обслуживать, его задача кинуть сообщения и получить ответ, не заморачиваясь кому кинул и от кого принял.
|
|||
|
||||
| loneybibi |
|
|||
|
Любитель ![]() ![]() Профиль Группа: Участник Сообщений: 257 Регистрация: 28.5.2010 Где: Донецк (Украина) Репутация: 3 Всего: 3 |
Лучшим способом и по моему самым удобным что я знаю, общение между потоками через сигнал-слот!
-------------------- Red Hat Fedora 17 Qt 4.8.1 (x64), GCC 4.4.3, G++ 4.4.3, QtCreator 2.4.1 |
|||
|
||||
| daemonaz |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 160 Регистрация: 4.5.2008 Репутация: нет Всего: нет |
loneybibi, это понятно, мне просто не хотелось указывать серверный класс явно, допустим объект этого класса-потока создается и запускается в MainWindow, и он пашет в течении всего времени существования породившего его класса (mainWindow), в то же время как клиентский поток может создаваться и запускаться в совершенно в разное время и в разных местах, создавать соединение QObject::connection и явно указывая ему, что серверный поток находится в mainwidow, как то не совсем на мой взгляд правильно. Я могу этот поток перенести в другой проект и состыковать его с другим потоком. вне зависимости от того, кто будет обслуживать, главное, чтобы собщение имело уникальный тип по которому можно понять обрабатывать его или нет.
|
|||
|
||||
| tzirechnoy |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1173 Регистрация: 30.1.2009 Репутация: 1 Всего: 16 |
Прям вот описание свойств любого message brokerа. Включая 0mq. |
|||
|
||||
| loneybibi |
|
|||
|
Любитель ![]() ![]() Профиль Группа: Участник Сообщений: 257 Регистрация: 28.5.2010 Где: Донецк (Украина) Репутация: 3 Всего: 3 |
Как вариант - named pipes!
-------------------- Red Hat Fedora 17 Qt 4.8.1 (x64), GCC 4.4.3, G++ 4.4.3, QtCreator 2.4.1 |
|||
|
||||
| daemonaz |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 160 Регистрация: 4.5.2008 Репутация: нет Всего: нет |
named pipes - что это?
|
|||
|
||||
| loneybibi |
|
|||
|
Любитель ![]() ![]() Профиль Группа: Участник Сообщений: 257 Регистрация: 28.5.2010 Где: Донецк (Украина) Репутация: 3 Всего: 3 |
http://ru.wikipedia.org/wiki/%D0%98%D0%BC%...%BD%D0%B0%D0%BB Кстати самому интересен вопрос, есть ли в Qt встроенные средства использования именованных каналов, кто знает подскажите?! Это сообщение отредактировал(а) loneybibi - 16.11.2012, 07:16 -------------------- Red Hat Fedora 17 Qt 4.8.1 (x64), GCC 4.4.3, G++ 4.4.3, QtCreator 2.4.1 |
|||
|
||||
| loneybibi |
|
|||
|
Любитель ![]() ![]() Профиль Группа: Участник Сообщений: 257 Регистрация: 28.5.2010 Где: Донецк (Украина) Репутация: 3 Всего: 3 |
Нашел информацию что для общения между процессами можно использовать класс QLocalSocket и QLocalServer, под Windows реализованы через pipe, под *nix через локальный сокет. Работа схожа с QTcpSocket и QTcpServer.
Вот описание встроенных в Qt кросс-платформенных методов взаимодействия потоков и процессов: http://doc.crossplatform.ru/qt/4.7.x/ipc.html http://doc.crossplatform.ru/qt/4.4.3/ipc.html Полазив по нашему форуму нашел инфо что использовать QLocalSocket как pipe'ы даже если одна машина на *nix другая под win и общаться через один pipe можно. Так что думаю что вам надо копать в эту сторону. Еще вариант, не знаю как под windows это будет практично, потому что он блокирует файлы при использовании, но на *nix система можно использовать обычный файл как pipe для обмена между потоками. -------------------- Red Hat Fedora 17 Qt 4.8.1 (x64), GCC 4.4.3, G++ 4.4.3, QtCreator 2.4.1 |
|||
|
||||
| daemonaz |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 160 Регистрация: 4.5.2008 Репутация: нет Всего: нет |
loneybibi, спасибо!
А вот еще Примеры использования QLocalSocket Это сообщение отредактировал(а) daemonaz - 16.11.2012, 10:24 |
|||
|
||||
| loneybibi |
|
||||
|
Любитель ![]() ![]() Профиль Группа: Участник Сообщений: 257 Регистрация: 28.5.2010 Где: Донецк (Украина) Репутация: 3 Всего: 3 |
В примере есть вот такое:
Не советую использовать QDataStream при работе с сокетами потому что если в приложении сервера будет указана одна версия а в клиенте будет другая, а возможно даже если просто собраны на разных версия Qt будут либо большие проблемы либо работать вообще не будет. Поищите по нашему форуму про socket'ы где то я недавно встречал такую тему, где было указано что лучше использовать вместо этого и даже подробно описано почему. Если я не ошибаюсь даже borisbn про это рассказывал. Единственное там код усложнится на пару строк и размер передаваемых данных надо будет указывать в ручную а не доверять это QDataStream. Сам на этом недавно попался когда с QTcpSocket'ами работал. Может и тут в топике кто напишет почему да что лучше ! Это сообщение отредактировал(а) loneybibi - 16.11.2012, 20:34 -------------------- Red Hat Fedora 17 Qt 4.8.1 (x64), GCC 4.4.3, G++ 4.4.3, QtCreator 2.4.1 |
||||
|
|||||
![]()
|
| Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |