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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Qt + boost::asio - простейший симбиоз  (Прочитано 15298 раз)
V1KT0P
Гость
« : Март 19, 2012, 21:21 »

Сразу скажу что я глядел на qt_echo_server, но там слишком много кода для того чтоб я смог сразу разобраться. Да и asio я только начал изучать.
Так вот несколько вопросов:
1. Как проще всего установить связь между Qt и asio?
2. Могу ли я добавлять задания для asio из разных потоков, потокобезопасно ли это?
3. Как из asio вызвать сигналы Qt так, чтобы сигнал объекта выполнялся в том потоке к которому принадлежит объект?
4. Забить на симбиоз и делать GUI и сервер отдельными приложениями? С одной стороны вроде хорошо, с другой стороны добавлять прослойку межпроцессорного взаимодействия не хочется.
Записан
BRE
Гость
« Ответ #1 : Март 19, 2012, 21:24 »

4. Забить на симбиоз и делать GUI и сервер отдельными приложениями?
Вот только так. Не нужны серверы с гуями, не должно быть на аппаратных серверах гуев.

А asio хорош, да. Правильный выбор. Еще я бы предложил посмотреть на erlang.
« Последнее редактирование: Март 19, 2012, 21:26 от BRE » Записан
V1KT0P
Гость
« Ответ #2 : Март 19, 2012, 21:46 »

А asio хорош, да. Правильный выбор. Еще я бы предложил посмотреть на erlang.
Все твердят что типа серверы на erlang получаются идеальные. Но мне его вообще не хочется изучать.
Я хочу еще изучить Java, Ruby, Python и мелочь вроде JavaScript и Lua.
Записан
V1KT0P
Гость
« Ответ #3 : Март 21, 2012, 17:11 »

А asio хорош, да. Правильный выбор.
Я так понял ты знаешь asio, как установить timeout на асинхронный сокет?
Записан
BRE
Гость
« Ответ #4 : Март 21, 2012, 17:31 »

Я так понял ты знаешь asio, как установить timeout на асинхронный сокет?
Я использую таймер (asio::deadline_timer).
Записан
V1KT0P
Гость
« Ответ #5 : Март 21, 2012, 17:40 »

Я так понял ты знаешь asio, как установить timeout на асинхронный сокет?
Я использую таймер (asio::deadline_timer).
Смотри, я использую стандартные вызовы:
Код
C++ (Qt)
socket_.async_read_some(boost::asio::buffer(buffer_),
   strand_.wrap(
     boost::bind(&connection::handle_read, shared_from_this(),
       boost::asio::placeholders::error,
       boost::asio::placeholders::bytes_transferred)));
boost::asio::async_write(socket_, reply_.to_buffers(),
   strand_.wrap(
     boost::bind(&connection::handle_write, shared_from_this(),
       boost::asio::placeholders::error)));
Как мне по событию таймера отменить эти задания?
Записан
BRE
Гость
« Ответ #6 : Март 21, 2012, 17:48 »

Как мне по событию таймера отменить эти задания?
Сказать сокету shutdown. Это приведет к срабатыванию всех активных обработчиков с кодом ошибки.
Записан
V1KT0P
Гость
« Ответ #7 : Март 21, 2012, 18:04 »

Как мне по событию таймера отменить эти задания?
Сказать сокету shutdown. Это приведет к срабатыванию всех активных обработчиков с кодом ошибки.

Спасибо, действительно работает.
Записан
Barmaglodd
Гость
« Ответ #8 : Март 23, 2012, 09:52 »


А asio хорош, да. Правильный выбор. Еще я бы предложил посмотреть на erlang.

asio-ужас на шаблонах, месяц пытался его освоить, но не смог до конца, хотя с остальными частями буста несколько лет работаю.
А Erlang да, хорош! После asio переделал всё за несколько дней на него.
Записан
V1KT0P
Гость
« Ответ #9 : Март 23, 2012, 11:55 »


А asio хорош, да. Правильный выбор. Еще я бы предложил посмотреть на erlang.

asio-ужас на шаблонах, месяц пытался его освоить, но не смог до конца, хотя с остальными частями буста несколько лет работаю.
А Erlang да, хорош! После asio переделал всё за несколько дней на него.
А по производительности как? Выросла или упала?
Записан
Barmaglodd
Гость
« Ответ #10 : Март 23, 2012, 16:19 »

Хз, у меня больше 200 клиентов никогда не было, ощутимой нагрузки они не создают. Да и сравнивать сложно, Erlang вариант далеко ущёл от прототипа на asio.
Записан
V1KT0P
Гость
« Ответ #11 : Март 23, 2012, 16:23 »

Хз, у меня больше 200 клиентов никогда не было, ощутимой нагрузки они не создают. Да и сравнивать сложно, Erlang вариант далеко ущёл от прототипа на asio.
Тю у меня сервер на Qt4 тянет 500 клиентов. Переписываю на asio только из-за того что необходимо тянуть 2500 клиентов.
Записан
V1KT0P
Гость
« Ответ #12 : Март 23, 2012, 18:03 »

Как мне по событию таймера отменить эти задания?
Сказать сокету shutdown. Это приведет к срабатыванию всех активных обработчиков с кодом ошибки.

Еще вопрос, какой аналог QDataStream есть в asio или boost? Необходимо иметь возможность указать порядок байт.
Записан
BRE
Гость
« Ответ #13 : Март 23, 2012, 18:13 »

Еще вопрос, какой аналог QDataStream есть в asio или boost? Необходимо иметь возможность указать порядок байт.
Не знаю такого.
Записан
V1KT0P
Гость
« Ответ #14 : Март 23, 2012, 18:20 »

Еще вопрос, какой аналог QDataStream есть в asio или boost? Необходимо иметь возможность указать порядок байт.
Не знаю такого.
А как тогда ты из буфера вытягиваешь данные с нужным порядком байт?
Может я что-то не так делаю:
1) Буфер у меня массив char(m_buffer), в asio передаю вот так:
Код
C++ (Qt)
m_socket.async_read_some(boost::asio::buffer(m_buffer+m_buffer_count, sizeof(m_buffer)-m_buffer_count),
                            m_strand.wrap(
                                boost::bind(&Connection::handleRead, shared_from_this(),
                                            boost::asio::placeholders::error,
                                            boost::asio::placeholders::bytes_transferred)));
Вытягиваю данные через memcpy, ибо не понял как по другому сделать.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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