Как интегрировать Повышение. Основной цикл Asio в платформе GUI как Qt4 или GTK

Mozilla работает над своим WebExtensions API . Говорят, что с API-интерфейсом переносить надстройки в другие браузеры и из них должно быть проще.

27
задан mavroprovato 16 November 2013 в 20:49
поделиться

3 ответа

Если я правильно понял ваш вопрос, у вас есть код, написанный для Boost.Asio. Вы хотели бы использовать этот код внутри приложения с графическим интерфейсом.

В вашем вопросе неясно, хотите ли вы обернуть сетевые уровни Qt / Gtk через asynio, чтобы ваш код работал, если вы просто ищете решение для одновременного использования как цикла событий gui, так и asynio.

Я предполагаю второй случай.

И Qt, и Gtk имеют методы для интеграции внешних событий в их цикл обработки событий. См., Например, qtgtk , где цикл событий Qt подключен к Gtk.

В конкретном случае Qt, если вы хотите генерировать события для Qt, вы можете использовать следующий класс: QAbstractEventDispatcher .

После беглого взгляда на boost asio, я думаю, вам нужно сделать следующее:

  • иметь повторяющийся QTimer с нулевой продолжительностью, который постоянно вызывает io_service :: run (). Таким образом, boost :: asio вызовет ваш обработчик завершения, как только ваша асинхронная операция будет завершена.
  • в вашем обработчике завершения два варианта: если вы хотите генерировать события для Qt, вы можете использовать следующий класс: QAbstractEventDispatcher .

    После беглого взгляда на boost asio, я думаю, вам нужно сделать следующее:

    • иметь повторяющееся QTimer с нулевой длительностью, который все время вызывает io_service :: run (). Таким образом, boost :: asio вызовет ваш обработчик завершения, как только ваша асинхронная операция будет завершена.
    • в вашем обработчике завершения два варианта: если вы хотите генерировать события для Qt, вы можете использовать следующий класс: QAbstractEventDispatcher .

      После беглого взгляда на boost asio, я думаю, вам нужно сделать следующее:

      • иметь повторяющееся QTimer с нулевой длительностью, который все время вызывает io_service :: run (). Таким образом, boost :: asio вызовет ваш обработчик завершения, как только ваша асинхронная операция будет завершена.
      • в вашем обработчике завершения два варианта:
        • если ваша операция завершения является длительной, отделенной от графического интерфейса, займитесь своим делом и регулярно вызывайте qApp.processEvents (), чтобы графический интерфейс оставался отзывчивым
        • , если вы просто хотите связаться с графическим интерфейсом:
          1. определить пользовательский тип QEvent
          2. подписаться на это событие
          3. разместить свое событие в цикле событий Qt, используя QCoreApplication :: postEvent () .
6
ответ дан 28 November 2019 в 05:40
поделиться

Простой: Создайте слот 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 для большего контроля.

Это приведет к тому, что все ожидающие обработки обработчики завершения Asio будут вызываться из потока графического интерфейса. Поскольку обработчики выполняются в потоке графического интерфейса пользователя, они могут изменять виджеты.

Теперь вам нужно убедиться, что io_service имеет возможность работать регулярно. Я рекомендую несколько раз повторять вызов графического интерфейса poll_one () . Я считаю, что у QT есть тиковый сигнал, который поможет. Вы, конечно, можете использовать свой собственный сигнал QT для большего контроля.

Это приведет к тому, что все ожидающие обработки обработчики завершения Asio будут вызываться из потока графического интерфейса. Поскольку обработчики выполняются в потоке графического интерфейса пользователя, они могут изменять виджеты.

Теперь вам нужно убедиться, что io_service имеет возможность работать регулярно. Я рекомендую несколько раз повторить вызов графического интерфейса poll_one () . Я считаю, что у QT есть тиковый сигнал, который поможет. Вы, конечно, можете использовать свой собственный сигнал QT для большего контроля.

Я считаю, что у QT есть тиковый сигнал, который поможет. Вы, конечно, можете использовать свой собственный сигнал QT для большего контроля.

Я считаю, что у QT есть тиковый сигнал, который поможет. Вы, конечно, можете использовать свой собственный сигнал QT для большего контроля.

15
ответ дан 28 November 2019 в 05:40
поделиться

Возможно подлинное объединение сетевых циклов . Это просто большая боль (и мне еще предстоит попробовать).

Запуск io_service::run() на отдельном потоке, наверное, и есть путь.

.
2
ответ дан 28 November 2019 в 05:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: