Как заменить основной цикл WT на ACE_Reactor
У нас есть проект с основной функциональностью, реализованной с использованием ACE и построенной вокруг его Reactor. Мы хотим добавить небольшой веб-интерфейс, используя Wt.
Таким образом, вопрос заключается в том, можно ли заменить основной контур интерфейса wt на реактор с ацетилом?
Единственная плохая идея, которая приходит мне в голову - это быстрый таймер на стороне Reactor, который каким-то образом вызывает весовую часть. С другой стороны, реактор можно запустить "тик за тик", используя его метод handle_events, но я не могу найти эквивалент на стороне wt.
примечание: главная проблема этого вопроса связана с темами. У нас нет потоков, код не является потокобезопасным, и для нас было бы намного проще, если бы HMI мог работать в том же потоке, что и остальная часть приложения. Но наличие 2 блокирующих вызовов, одного для Reactor->run_reactor_event_loop(), а другого для Wt::WRun(), является проблемой!
1 ответ
Это может работать с некоторыми модификациями разъема Wt. Wt может быть скомпилирован без поддержки потоков, поэтому в коннекторе должна быть какая-то петля select(). Что вам нужно, это возможность подключиться к этому циклу с таймером.
Вы говорите о коннекторе http? Это реализовано с boost.asio, так что asio deadline_timer с async_wait, который выполняет Reactor->run_reactor_event_loop(), может быть всем, что вам нужно. Может быть, вы даже найдете другую идею, когда погрузитесь в документацию по boost.asio...
Это может даже работать без изменений в разъеме. Это не задокументировано, но Server::instance()->service() (в src/http/Server.h) возвращает вам службу asio, необходимую для реализации этого.
Больше информации -> Список рассылки Wt?