我正在使用默认情况下具有非阻塞 I/O 的 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")、立即处理它们。我不想阻止等待机器完成处理我发送给它的所有事件。问题是它们必须与上述网络事件交错,通知机器正在下载的 url。没有交错机器就无法推进其状态(并处理我的事件),因为从 *ing 推进到 *ed 只有在接收到网络类型的事件之后才会发生。
如何实现我的设计目标?
编辑
- 我正在使用的状态机有自己的事件循环,并且事件没有在其中排队,因此如果机器忙时它们来了,机器可能会错过它们。
- 网络 I/O 事件既不会直接发布到状态机,也不会直接发布到我正在使用的事件队列中。它们被发布到我的代码(处理程序)中,我必须处理它们。我可以随心所欲地转发它们,但请记住没有。1.
看看我对这个问题的回答,我在其中详细描述了我当前的设计。问题是我是否以及如何通过制作它来改进这个设计
- 更强大
- 更简单