Mozilla работает над своим WebExtensions API . Говорят, что с API-интерфейсом переносить надстройки в другие браузеры и из них должно быть проще.
Если я правильно понял ваш вопрос, у вас есть код, написанный для Boost.Asio. Вы хотели бы использовать этот код внутри приложения с графическим интерфейсом.
В вашем вопросе неясно, хотите ли вы обернуть сетевые уровни Qt / Gtk через asynio, чтобы ваш код работал, если вы просто ищете решение для одновременного использования как цикла событий gui, так и asynio.
Я предполагаю второй случай.
И Qt, и Gtk имеют методы для интеграции внешних событий в их цикл обработки событий. См., Например, qtgtk , где цикл событий Qt подключен к Gtk.
В конкретном случае Qt, если вы хотите генерировать события для Qt, вы можете использовать следующий класс: QAbstractEventDispatcher .
После беглого взгляда на boost asio, я думаю, вам нужно сделать следующее:
После беглого взгляда на boost asio, я думаю, вам нужно сделать следующее:
После беглого взгляда на boost asio, я думаю, вам нужно сделать следующее:
Простой:
Создайте слот QT, который вызывает io_service :: poll_one ()
, принадлежащий графическому интерфейсу. Подключите этот слот к сигналу Tick
QT.
Подробно:
К счастью для вас, Boost.Asio очень хорошо разработан. Есть много вариантов того, как обеспечить поток выполнения базовым асинхронным внутренним компонентам. Люди уже упоминали об использовании io_service :: run ()
, блокирующего вызова со многими недостатками.
Вам разрешен доступ к графическим интерфейсам только из одного потока. Внешним потокам обычно необходимо отправлять события в графический интерфейс, если они хотят изменить какой-либо виджет. Это очень похоже на то, как работает Asio.
Наивный подход состоит в том, чтобы просто выделить один поток (или таймер) для выполнения io_service :: run ()
и заставить обработчик завершения Asio отправить сигнал графического интерфейса. Этот будет работать.
Вместо этого вы можете использовать гарантию, что обработчики завершения будут вызываться только в потоке выполнения вызывающего io_service
. Дон' У меня есть вызов потока графического интерфейса io_service :: run ()
, поскольку он блокирует и может зависание графического интерфейса. Вместо этого используйте io_service :: poll ()
или io_service :: poll_one ()
. Это приведет к тому, что все ожидающие обработки обработчики завершения Asio будут вызваны из потока графического интерфейса. Поскольку обработчики выполняются в потоке графического интерфейса пользователя, они могут изменять виджеты.
Теперь вам нужно убедиться, что io_service
имеет возможность работать регулярно. Я рекомендую несколько раз повторять вызов графического интерфейса poll_one ()
. Я считаю, что у QT есть тиковый сигнал, который поможет. Вы, конечно, можете использовать свой собственный сигнал QT для большего контроля.
Теперь вам нужно убедиться, что io_service
имеет возможность работать регулярно. Я рекомендую несколько раз повторять вызов графического интерфейса poll_one ()
. Я считаю, что у QT есть тиковый сигнал, который поможет. Вы, конечно, можете использовать свой собственный сигнал QT для большего контроля.
Теперь вам нужно убедиться, что io_service
имеет возможность работать регулярно. Я рекомендую несколько раз повторить вызов графического интерфейса poll_one ()
. Я считаю, что у QT есть тиковый сигнал, который поможет. Вы, конечно, можете использовать свой собственный сигнал QT для большего контроля.
Возможно подлинное объединение сетевых циклов . Это просто большая боль (и мне еще предстоит попробовать).
Запуск io_service::run() на отдельном потоке, наверное, и есть путь.
.