会话管理

会话是一组运行中的应用程序,每个应用程序都有其特定的状态。会话由称为会话 managerservice 的服务控制。参与会话的应用程序称为会话客户端。

会话管理人员代表用户向其客户端发出命令。这些命令可能会使客户端提交未保存的更改(例如通过保存打开的文件),为未来的会话保留它们的状态,或者优雅地终止。这些操作的集合称为会话管理。

在常规情况下,会话由用户在同一时间在其桌面上运行的所有应用程序组成。然而,在 Unix/X11 下,会话可能包括在多台不同的计算机上运行的应用程序,并且可能跨越多个显示。

关闭会话

会话由会话管理员关闭,通常是代表用户在用户想要注销时进行。系统也可能在紧急情况下自动关闭,例如,当即将停电时。显然,这些类型的关闭之间存在着显著的区别。在第一种情况下,用户可能会与应用程序交互,指定 exactly which files 应该保存以及应该丢弃哪些文件。在后一种情况下,没有时间进行交互。甚至可能没有用户坐在机器前!

在各个平台上的协议和支持

在 macOS 和 Windows 2000 之前的 Microsoft Windows 版本中,还没有为应用程序提供完整的会话管理功能,即无法恢复以前的会话。(Windows 2000 和 XP 提供了“休眠”功能,即将整个内存保存到磁盘,并在重启机器时恢复。)它们支持优雅的注销,以便应用程序在获得用户确认后有机会取消此过程。这是对应于 QGuiApplication::commitDataRequest() 信号的功能。

X11 自 X11R6 开始就支持完整的会话管理。

使会话管理在 Qt 中工作

首先将槽连接到 QGuiApplication::commitDataRequest() 信号,以使您的应用程序能够参与优雅的注销过程。如果您仅针对 Microsoft Windows 平台进行开发,那么您只能和必须提供这一点。理想情况下,您的应用程序应提供类似于以下所示的关闭对话框

A typical dialog on shutdown

此对话框的示例代码可以在 QSessionManager::allowsInteraction 的文档中找到。

要实现完整的会话管理(目前仅支持X11R6),您还必须注意保存应用程序的状态,以及在会话的下一次生命周期的状态恢复。这种保存是通过实现与QGuiApplication::saveStateRequest() 信号连接的槽来完成的。您在这个函数中保存的所有状态数据,都应该用会话标识符QGuiApplication::sessionId() 标记。这个应用程序特定的标识符是全球唯一的,所以不会发生冲突。(有关保存/恢复特定Qt应用程序的状态信息,请参阅QSessionManager。)

恢复通常在应用程序的main()函数中完成。检查QGuiApplication::isSessionRestored() 是否为true。如果是这样,再次使用会话标识符QGuiApplication::sessionId() 来访问您的状态数据并恢复应用程序的状态。

注意:为了允许窗口管理器恢复窗口属性,如堆叠顺序或几何信息,您必须使用唯一的应用程序级对象名称来标识您的顶层小部件(请参阅QObject::setObjectName())。在恢复应用程序时,您必须确保所有恢复的顶层小部件都有与之前相同的唯一名称。

测试和调试会话管理

由于操作系统本身缺乏这种功能,macOS和Windows上的会话管理支持相当有限。简单关闭会话,并验证您的应用程序是否按预期运行即可。在启动应用程序之前启动另一个应用程序,通常是一个集成的开发环境,可能是有用的。其他应用程序会在之后收到关闭消息,因此可以取消关闭。否则,您每次测试运行后都必须重新登录,这虽然不是问题本身,但很费时。

在Unix上,您可以使用支持标准X11R6会话管理的桌面环境,或者,推荐的方法是使用X Consortium提供会话管理参考实现。这个示例管理器被称为xsm,是标准X11R6安装的一部分。与X11一样,提供了一个有用且信息丰富的手册页。使用xsm很简单(除了笨拙的基于Athena的用户界面)。这里有一个简单的方法

  • 运行X11R6。
  • 在您的家目录中创建一个名为.xsmstartup的点文件,其中只包含一行
    xterm

    这告诉xsm默认/容错会话只是xterm,没有其他内容。否则xsm会尝试调用包括窗口管理器twm在内的许多客户端,这并不很有帮助。

  • 现在从另一个终端窗口启动xsm。一个会话管理窗口和一个xterm都将出现。xterm有一个很好属性,它将其与其他所有当前运行的shell区分开来:在其shell中,SESSION_MANAGER环境变量指向您刚刚启动的会话管理器。
  • 从新的xterm窗口启动您的应用程序。它将自动连接到会话管理器。您可以使用ClientList按钮检查连接是否成功。

    注意:启动或结束会话管理客户端时,切勿打开ClientList!否则xsm可能会崩溃。

  • 使用会话管理器的检查点关闭按钮,并查看应用程序的行为。保存类型本地表示客户端应该保存其状态。它对应于QGuiApplication::saveStateRequest()信号。全局保存类型要求应用将其未保存的更改保存到永久且全局可访问的存储。它调用QGuiApplication::commitDataRequest
  • 每次发生崩溃时,责怪xsm而不是Qt。在用户的桌面上,xsm远远不是一个可用的会话管理器。然而,它足够稳定且有用,可以作为测试环境。

© 2024Qt公司。此处包含的文档贡献属于其各自所有者的版权。提供的文档是根据免费软件基金会发布的条款许可的《GNU自由文档许可》版本1.3。Qt及其相关标志是芬兰的Qt公司及其在全世界其他国家的商标。所有其他商标均为其各自所有者的财产。