Я использую инфраструктуру Qt, которая по умолчанию имеет неблокирующий ввод-вывод для разработки приложения, перемещающегося по нескольким веб-страницам (интернет-магазинам) и выполняющего различные действия на этих страницах. Я «сопоставляю» конкретную веб-страницу с конечным автоматом, который использую для навигации по этой странице.
Этот конечный автомат имеет следующие переходы:Connect, LogIn, Query, LogOut, Disconnect
и эти состояния:Start, Connecting, Connected, LoggingIn, LoggedIn, Querying, QueryDone, LoggingOut, LoggedOut, Disconnecting, Disconnected
Переходы из состояния *ing в состояние *ed (Connecting->Connected
) происходят из-за LoadFinished
асинхронных сетевых событий, полученных от сетевого объекта при загрузке текущего запрошенного URL-адреса. Переходы из состояния *ed в состояние *ing (Connected->LoggingIn
) происходят из-за событий, отправляемых мной.
Я хочу иметь возможность отправлять несколько событий (команд) на этот компьютер (например, Connect, LogIn, Query("productA"), Query("productB"), LogOut, LogIn, Query("productC"), LogOut, Disconnect) сразу и обработать их. Я не хочу блокировать ожидание, пока компьютер завершит обработку всех событий, которые я ему отправил. Проблема в том, что они должны чередоваться с вышеупомянутыми сетевыми событиями, информирующими машину о загружаемом URL-адресе. Без чередования машина не может изменить свое состояние (и обработать мои события), потому что переход от *ing к *ed происходит только после получения события сетевого типа.
Как я могу достичь своей дизайнерской цели?
ИЗМЕНИТЬ
- Конечный автомат, который я использую, имеет свой собственный цикл событий, и события не ставятся в очередь в нем, поэтому машина может пропустить их, если они приходят, когда машина занята.
- События сетевого ввода-вывода не отправляются напрямую ни в конечный автомат, ни в очередь событий, которую я использую. Они публикуются в моем коде (обработчике), и я должен их обрабатывать. Я могу переслать их по своему желанию, но, пожалуйста, имейте в виду примечание №. 1.
Взгляните на мой ответ на этот вопрос, где я подробно описал свой текущий дизайн. Вопрос в том, могу ли я улучшить этот дизайн, сделав его
- More robust
- Проще