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

2024-01-06

我正在使用 Qt 框架,该框架默认具有非阻塞 I/O 来开发一个应用程序,该应用程序可以浏览多个网页(在线商店)并在这些页面上执行不同的操作。我将特定网页“映射”到状态机,我用它来浏览该页面。
该状态机具有以下转换;
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)是由于我发送的事件造成的。
我希望能够向这台机器发送多个事件(命令)(例如连接、登录、查询(“productA”)、查询(“productB”)、注销、登录、查询(“productC”)、注销、断开连接)at once并让它处理它们。我不想阻止等待机器完成处理我发送给它的所有事件。问题是它们必须与上述网络事件交织在一起,通知机器正在下载的 URL。如果没有交错,机器就无法推进其状态(并处理我的事件),因为从 *ing 推进到 *ed 仅在接收到网络类型的事件后才会发生。

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

EDIT

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

    • 更坚固
    • Simpler

听起来您希望状态机有一个事件队列。将事件排队,开始处理第一个事件,完成后将下一个事件从队列中拉出并开始处理。因此,状态机不是由客户端代码直接驱动,而是由队列驱动。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

面对非阻塞I/O如何设计状态机? 的相关文章

随机推荐