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