пятница, 1 апреля 2011 г.

Qt Echo Server released

Всем, кому интересно, как связать многопоточный код с functor-based callbacks (например, Boost.Asio) и Qt signal/slot, смотреть проект qt_echo_server.
Решение простое и не использует никаких "хаков" - все по официальной документации Qt.
И так, Boost.Asio (+ Boost.Bind + Boost.Thread) + Qt (4.x) = qt_echo_server

6 комментариев:

niXman комментирует...

есть способ намного проще: http://doc.qt.nokia.com/latest/qmetaobject.html#invokeMethod

Marat комментирует...

Читал.

Способ из echo_server как раз таки проще (мы же говорим не об объеме исходного кода?):
1) никаких мета-данных - что уже дает выигрыш в скорости - да и к чему использовать подсистему мета-данных, когда можно обойтись без нее?
2) вызывающей стороне нет необходимости знать, что конкретно вызывать - вариант из qt_echo_server похож в этом на boost::function.

В данном случае (он, кстати, довольно общий)
использование invokeMethod равносильно использованию reflection в Java вместо listener.

niXman комментирует...

по началу, я немного неверное понял архитектуру этого проекта.
у Вас, наверняка, целью было показать интеграцию "реализации" и GUI.
я же, всегда разделяю реализацию от GUI так, чтоб GUI к реализации "наклеивался" всего одним стыком, и работала реализация с любым GUI, или даже с callback`ами в терминале.
именно исходя из этих соображений я и понял Ваш код не верно, т.е. так, как будто это единственный способ.

Marat комментирует...

To niXman:
Вообще-то, я был неправ.
То, что написано в qt_echo_server как раз в итоге выливается в invokeMethod.
Но, в "моем" варианте invokeMethod "подается" в "красивой обертке" стандартного для Qt механизма signal/slot со всеми его "вкусностями" - конкретно мне нужен быд метод disconnect.

Marat комментирует...

To niXman:
В qt_echo_server именно что реализация самого сервера (классы session_manager и session - см. их же в echo_server - консольный вариант) отделена от GUI.
qt::Service - оболочка-прослойка для приведения session_manager в Qt-style (signal/slot) с дальнейшим стандартным для Qt подключением к чему угодно, например, к GUI.

niXman комментирует...

значит я не с того начал.
начну-ка я с echo_server и async_basics.