セッション管理

セッションとは、実行中のアプリケーションのグループのことで、それぞれが特定の状態を持つ。セッションは、セッション・ マネージャーと呼ばれるサービスによって制御される。セッションに参加するアプリケーションはセッションクライアントと呼ばれる。

セッション・マネージャーは、ユーザーに代わってクライアントにコマンドを発行します。これらのコマンドは、クライアントに未保存の変更をコミットさせたり(例えば、開いているファイルを保存する)、将来のセッションのために状態を保持させたり、優雅に終了させたりします。これらの操作の集合をセッション 管理と呼ぶ。

一般的なケースでは、セッションは、ユーザーがデスクトップ上で一度に実行するすべてのアプリケーションで構成されます。しかし、Unix/X11では、1つのセッションに異なるコンピュータで実行されているアプリケーションが含まれ、複数のディスプレイにまたがっている場合があります。

セッションのシャットダウン

セッションのシャットダウンは、通常、ユーザーがログアウトするときに、ユーザーに代わってセッションマネージャーが行います。システムはまた、例えば電源が失われそうな場合など、緊急事態に自動シャットダウンを行うかもしれません。これらのタイプのシャットダウンには明らかに大きな違いがある。前者の場合、ユーザーはアプリケーションと対話し、どのファイルを保存し、どのファイルを破棄するかを正確に指定することができます。後者の場合、対話する時間はない。マシンの前に座っているユーザーさえいないかもしれない!

異なるプラットフォームでのプロトコルとサポート

macOSや、Windows 2000以前のMicrosoft Windowsのバージョンでは、アプリケーションの完全なセッション管理のようなものはまだありません。(Windows2000とXPは、メモリ全体がディスクに保存され、マシンの再起動時に復元される「ハイバネーション」を提供している)。Windows2000と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コンソーシアムが提供しているセッション・マネージャのリファレンス実装を使うことを推奨します。このサンプル・マネージャはxsm と呼ばれ、標準的な X11R6 インストールの一部です。X11の常として、便利で有益なマニュアルページが提供されています。xsm の使い方は簡単です(Athena ベースの使いにくいユーザーインターフェイスを除けば)。簡単な方法を紹介しよう:

  • X11R6を起動する。
  • ホームディレクトリにドットファイル.xsmstartup を作成する。
    xterm

    これはxsm 、デフォルト/フェイルセーフセッションが単なるxtermであり、他には何もないことを伝えます。そうしないと、xsm はウィンドウマネージャtwm を含むたくさんのクライアントを呼び出そうとするので、あまり役に立ちません。

  • 別のターミナルウィンドウからxsm 。セッション・マネージャー・ウィンドウとxtermの両方が表示されます。xtermには、現在実行している他のすべてのシェルとは異なる素晴らしい特性があります。そのシェル内では、SESSION_MANAGER 環境変数が、先ほど起動したセッションマネージャーを指しています。
  • 新しいxtermウィンドウからアプリケーションを起動してください。自動的にセッションマネージャーに接続します。接続が成功したかどうかは、クライアントリストのプッシュボタンで確認できます。

    注意: セッションマネージドクライアントを開始または終了するときに、クライアントリストを開いたままにしないでください!xsm がクラッシュする可能性があります。

  • セッションマネージャのチェックポイントボタンとシャットダウンボタンを異なる設定で使用し、アプリ ケーションの動作を確認してください。saveタイプlocalは、クライアントが状態を保存することを意味します。これはQGuiApplication::saveStateRequest() シグナルに対応します。グローバル・セーブ・タイプは、アプリケーションに、保存されていない変更を、永続的でグローバルにアクセス可能なストレージに保存するように要求します。これはQGuiApplication::commitDataRequest() を呼び出します。
  • 何かがクラッシュしたときは、Qt ではなくxsm のせいにしてください。xsm は、ユーザーのデスクトップで使えるセッション・マネージャーにはほど遠いものです。しかし、テスト環境としては十分安定しており、有用です。

©2024 The Qt Company Ltd. 本書に含まれるドキュメントの著作権は、それぞれの所有者に帰属します。 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。