如何设计面向非阻塞I/O的状态机?

Pio*_*ost 3 c++ events qt state-machine qstatemachine

我正在使用Qt框架,该框架默认具有非阻塞I/O,用于开发浏览多个网页(在线商店)并在这些页面上执行不同操作的应用程序.我正在将特定网页"映射"到我用来浏览此页面的状态机.
这个状态机有这些转换;
Connect, LogIn, Query, LogOut, Disconnect
和这些国家;
Start, Connecting, Connected, LoggingIn, LoggedIn, Querying, QueryDone, LoggingOut, LoggedOut, Disconnecting, Disconnected
从*ing到*ed states(Connecting->Connected)的转换是由于LoadFinished当前请求的url被加载时从网络对象接收的异步网络事件.从*ed到*ing states(Connected->LoggingIn)的转换是由我发送的事件引起的.
我希望能够向该机器发送多个事件(命令)(如Connect,LogIn,Query("productA"),Query("productB"),LogOut,LogIn,Query("productC"),LogOut,Disconnect)立刻让它处理它们.我不想阻止等待机器完成处理我发送给它的所有事件.问题是它们必须与上述网络事件交错,通知机器有关正在下载的URL.没有交错机器无法推进其状态(并处理我的事件),因为只有在接收到网络类型的事件后才会从*ing前进到*ed.

我怎样才能实现我的设计目标?

编辑

  1. 我正在使用的状态机有自己的事件循环,并且事件没有在其中排队,因此当机器忙时,机器可能会错过它们.
  2. 网络I/O事件不直接发布到状态机和我正在使用的事件队列.它们被发布到我的代码(处理程序),我必须处理它们.我可以按照自己的意愿转发它们,但请注意不要.1.
  3. 看看我的回答这个问题,我描述了我目前的设计中的细节.问题是我是否以及如何通过制作来改进这种设计

    • 更强大
    • 更简单

Ste*_*sop 6

听起来好像你希望状态机有一个事件队列.对事件进行排队,开始处理第一个事件,并在完成时将下一个事件从队列中拉出并开始执行.因此,不是直接由客户端代码驱动状态机,而是由队列驱动.

这意味着任何涉及在下一个过程中使用一个过渡结果的逻辑必须在机器中.例如,如果"登录完成"页面告诉您下一步该去哪里.如果那是不可能的,那么事件可能包括机器可以调用的回调,以返回它需要知道的任何内容.