【发布时间】:2009-08-12 10:18:50
【问题描述】:
我正在使用默认情况下具有非阻塞 I/O 的 Qt 框架来开发一个应用程序,该应用程序可以在多个网页(在线商店)中导航并在这些页面上执行不同的操作。我正在将特定网页“映射”到用于浏览此页面的状态机。
这个状态机有这些转换;Connect, LogIn, Query, LogOut, Disconnect
以及这些状态;Start, Connecting, Connected, LoggingIn, LoggedIn, Querying, QueryDone, LoggingOut, LoggedOut, Disconnecting, Disconnected
从 *ing 状态到 *ed 状态 (Connecting->Connected) 的转换是由于在加载当前请求的 url 时从网络对象接收到的 LoadFinished 异步网络事件。从 *ed 到 *ing 状态 (Connected->LoggingIn) 的转换是由于我发送的事件。
我希望能够向这台机器发送多个事件(命令)(如 Connect、LogIn、Query("productA")、Query("productB")、LogOut、LogIn、Query("productC")、LogOut、Disconnect) 立即并让它处理它们。我不想阻止等待机器完成处理我发送给它的所有事件。问题是它们必须与上述网络事件交错,通知机器正在下载的 url。没有交错,机器无法推进其状态(并处理我的事件),因为从 *ing 推进到 *ed 仅在接收到网络类型的事件后发生。
如何实现我的设计目标?
编辑
- 我正在使用的状态机有自己的事件循环,并且事件没有在其中排队,因此如果机器忙时它们来了,机器可能会错过它们。
- 网络 I/O 事件既不会直接发布到状态机,也不会直接发布到我正在使用的事件队列中。它们被发布到我的代码(处理程序)中,我必须处理它们。我可以随心所欲地转发它们,但请记住没有。 1.
-
看看我对这个问题的答案,我在其中详细描述了我当前的设计。问题是我是否以及如何通过制作它来改进这个设计
- 更健壮
- 更简单
【问题讨论】:
标签: c++ qt events state-machine qstatemachine