Поиск:

Ответ в темуСоздание новой темы Создание опроса
> нужна помощь по потокам 
:(
    Опции темы
daemonaz
Дата 13.11.2012, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 160
Регистрация: 4.5.2008

Репутация: нет
Всего: нет



Мне нужна помощь профи, опыта маловато, хотелось бы понять каким образом организовать обмен обобщениями между потоками: один из них постоянно работает в качестве "сервера", а остальные создаются динамически по надобности, передают свои данные в виде запросов "серверу", и от него же и принимают ответы. В голову приходят всякие сигналы и слоты, однако объекты классов-"клиентов" рождаются и умирают в разное время,  к тому же к "серверу" должен быть подключен только один клиент, мысль использовать сигналы-слот на мой взгляд не совсем хорошая. Что можете посоветовать?
PM MAIL   Вверх
tzirechnoy
Дата 13.11.2012, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: 1
Всего: 16



TCP/IP или 0mq.
PM MAIL   Вверх
daemonaz
Дата 13.11.2012, 12:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 160
Регистрация: 4.5.2008

Репутация: нет
Всего: нет



tzirechnoy, нет-нет, я использую в "серверном"-потоке обычный ком-порт, который контролирует соединения и осуществляет передачу и прием данных в/из COM-порта в поток-потребитель или клиент по запросу, просто для удобства назвал "сервером" и "клиентом".
PM MAIL   Вверх
borisbn
Дата 13.11.2012, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



daemonaz, можно замутить что-нибудь типа такого
Код
// "server" h-file
struct Command
{
    std::vector< unsigned char > data;
    std::function< void( const std::vector< unsigned char > & ) > responseListener;
    
    Command( const std::vector< unsigned char > & d, std::function< void( const std::vector< unsigned char > & ) > r )
        : data( d ), responseListener( r )
    {
    }
};
std::deque< Command * > m_commands;
QSemaphore m_semaphore;
QMutex m_mutex;

// "server" cpp-file
void Thread::run()
{
    while ( ! m_aborted )
    {
        m_semaphore.acquire();
        m_mutex.lock();
        Command * cmd = m_commands.front();
        m_commands.pop_front();
        m_mutex.unlock();
        // do some deal with cmd->data. e.g. write them to COM-port
        std::vector< unsigned char > response;
        // wait for response
        cmd->responseListener( response );
        delete cmd;
    }
}

void Thread::addCommand( const std::vector< unsigned char > & data, std::function< void( const std::vector< unsigned char > & ) > responseListener )
{
    m_mutex.lock();
    m_commands.push_back( new Command( data, responseListener ) );
    m_mutex.unlock();
    m_semaphore.release();
}

// "client"
...
Thread m_server;
...
void Client::onResponse( const std::vector< unsigned char > & response )
{
    // do some deal with response
}

void Client::doRequest( const std::vector< unsigned char > & request )
{
    m_server.addCommand( request, std::bind( & Client::doRequest, this, std::placeholders::_1 ) );
}


только чем это лучше, чем signal/slot'ы - хз

Это сообщение отредактировал(а) borisbn - 13.11.2012, 16:09


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
tzirechnoy
Дата 13.11.2012, 20:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: 1
Всего: 16



Цитата
просто для удобства назвал "сервером" и "клиентом".


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

У Вас вряд ли такая ситуацыя. Так что имеет прямой смысл использовать либо сокеты, либо какую-нибудь известную надстройку над ними (напрм. 0mq).
PM MAIL   Вверх
daemonaz
Дата 14.11.2012, 21:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 160
Регистрация: 4.5.2008

Репутация: нет
Всего: нет



borisbn, ну а все таки есть ли попроше способ, который бы позволил гибко подключать любой поток-клиент к потоку-серваку, ну широковещательные события что ли отослать, или какой-то канал создать между ними, а сервер должен перехватить это сообщение по типу сообщения. Хотелось бы чтобы клиентскому потоку пофиг какой серверный поток будет его обслуживать, его задача кинуть сообщения и получить ответ, не заморачиваясь кому кинул и от кого принял.
PM MAIL   Вверх
loneybibi
Дата 15.11.2012, 00:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель
**


Профиль
Группа: Участник
Сообщений: 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
PM MAIL ICQ   Вверх
daemonaz
Дата 15.11.2012, 09:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 160
Регистрация: 4.5.2008

Репутация: нет
Всего: нет



loneybibi,  это понятно, мне просто не хотелось указывать серверный класс явно, допустим объект этого класса-потока создается и запускается в MainWindow, и он пашет в течении всего времени существования породившего его класса (mainWindow), в то же время как клиентский поток может создаваться и запускаться в совершенно в разное время и в разных местах, создавать соединение QObject::connection и явно указывая ему, что серверный поток находится в mainwidow, как то не совсем на мой взгляд правильно. Я могу этот поток перенести в другой проект и состыковать его с другим потоком. вне зависимости от того, кто будет обслуживать, главное, чтобы собщение имело уникальный тип по которому можно понять обрабатывать его или нет.   smile 
PM MAIL   Вверх
tzirechnoy
Дата 15.11.2012, 09:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: 1
Всего: 16



Цитата
ну широковещательные события что ли отослать, или какой-то канал создать между ними, а сервер должен перехватить это сообщение по типу сообщения. 


Прям вот описание свойств любого message brokerа. Включая 0mq.
PM MAIL   Вверх
loneybibi
Дата 15.11.2012, 18:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель
**


Профиль
Группа: Участник
Сообщений: 257
Регистрация: 28.5.2010
Где: Донецк (Украина)

Репутация: 3
Всего: 3



Как вариант - named pipes! smile


--------------------
Red Hat Fedora 17
Qt 4.8.1 (x64), GCC 4.4.3,
G++ 4.4.3, QtCreator 2.4.1
PM MAIL ICQ   Вверх
daemonaz
Дата 15.11.2012, 21:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 160
Регистрация: 4.5.2008

Репутация: нет
Всего: нет



named pipes - что это?
PM MAIL   Вверх
loneybibi
Дата 16.11.2012, 06:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель
**


Профиль
Группа: Участник
Сообщений: 257
Регистрация: 28.5.2010
Где: Донецк (Украина)

Репутация: 3
Всего: 3



Цитата(daemonaz @ 15.11.2012,  20:24)
named pipes - что это?

http://ru.wikipedia.org/wiki/%D0%98%D0%BC%...%BD%D0%B0%D0%BB
Кстати самому интересен вопрос, есть ли в Qt встроенные средства использования именованных каналов, кто знает подскажите?! smile

Это сообщение отредактировал(а) 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
PM MAIL ICQ   Вверх
loneybibi
Дата 16.11.2012, 08:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель
**


Профиль
Группа: Участник
Сообщений: 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
PM MAIL ICQ   Вверх
daemonaz
Дата 16.11.2012, 10:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 160
Регистрация: 4.5.2008

Репутация: нет
Всего: нет



loneybibi,  спасибо!   smile 
А вот еще
Примеры использования QLocalSocket

Это сообщение отредактировал(а) daemonaz - 16.11.2012, 10:24
PM MAIL   Вверх
loneybibi
Дата 16.11.2012, 20:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель
**


Профиль
Группа: Участник
Сообщений: 257
Регистрация: 28.5.2010
Где: Донецк (Украина)

Репутация: 3
Всего: 3



Цитата(daemonaz @ 16.11.2012,  09:11)
loneybibi,  спасибо!   smile 
А вот еще
Примеры использования QLocalSocket

В примере есть вот такое:
Код

QDataStream out(&block, QIODevice::WriteOnly);
out.setVersion(QDataStream::Qt_4_0);

Не советую использовать QDataStream при работе с сокетами потому что если в приложении сервера будет указана одна
версия а в клиенте будет другая, а возможно даже если просто собраны на разных версия Qt будут
либо большие проблемы либо работать вообще не будет. Поищите по нашему форуму про socket'ы
где то я недавно встречал такую тему, где было указано что лучше использовать вместо этого и
даже подробно описано почему. Если я не ошибаюсь даже borisbn про это рассказывал.

Единственное там код усложнится на пару строк и размер передаваемых данных надо будет указывать
в ручную а не доверять это QDataStream. smile

Сам на этом недавно попался когда с QTcpSocket'ами работал.

Может и тут в топике кто напишет почему да что лучше ! smile 

Это сообщение отредактировал(а) 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
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0604 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.