Verwaltung von Sitzungen

Eine Sitzung ist eine Gruppe von laufenden Anwendungen, von denen jede einen bestimmten Zustand hat. Die Sitzung wird von einem Dienst namens Sitzungsmanager gesteuert. Die Anwendungen, die an der Sitzung teilnehmen, werden Sitzungsclients genannt.

Der Sitzungsmanager gibt im Namen des Benutzers Befehle an seine Clients aus. Diese Befehle können die Clients veranlassen, nicht gespeicherte Änderungen zu übernehmen (z. B. durch Speichern geöffneter Dateien), ihren Zustand für künftige Sitzungen zu bewahren oder die Sitzung ordnungsgemäß zu beenden. Die Gesamtheit dieser Vorgänge wird als Sitzungsverwaltung bezeichnet.

Im allgemeinen Fall besteht eine Sitzung aus allen Anwendungen, die ein Benutzer gleichzeitig auf seinem Desktop ausführt. Unter Unix/X11 kann eine Sitzung jedoch auch Anwendungen umfassen, die auf verschiedenen Computern laufen und sich über mehrere Bildschirme erstrecken können.

Beenden einer Sitzung

Eine Sitzung wird vom Sitzungsmanager beendet, normalerweise im Namen des Benutzers, wenn dieser sich abmelden möchte. Ein System kann auch ein automatisches Herunterfahren in einer Notsituation durchführen, z. B. wenn ein Stromausfall droht. Zwischen diesen beiden Arten des Herunterfahrens gibt es natürlich einen großen Unterschied. Im ersten Fall kann der Benutzer mit der Anwendung interagieren und genau angeben, welche Dateien gespeichert und welche verworfen werden sollen. Im letzteren Fall bleibt keine Zeit für eine Interaktion. Möglicherweise sitzt nicht einmal ein Benutzer vor dem Rechner!

Protokolle und Unterstützung auf verschiedenen Plattformen

Unter macOS und Microsoft Windows-Versionen vor Windows 2000 gibt es noch keine vollständige Sitzungsverwaltung für Anwendungen, d. h. keine Wiederherstellung früherer Sitzungen. (Windows 2000 und XP bieten einen "Ruhezustand", bei dem der gesamte Speicher auf der Festplatte gespeichert und beim Neustart des Rechners wiederhergestellt wird.) Sie unterstützen jedoch "Graceful Logouts", bei denen Anwendungen die Möglichkeit haben, den Vorgang nach einer Bestätigung durch den Benutzer abzubrechen. Dies ist die Funktionalität, die dem Signal QGuiApplication::commitDataRequest() entspricht.

X11 unterstützt die vollständige Sitzungsverwaltung seit X11R6.

Sitzungsverwaltung mit Qt zum Laufen bringen

Beginnen Sie damit, einen Slot mit dem QGuiApplication::commitDataRequest()-Signal zu verbinden, um Ihre Anwendung in die Lage zu versetzen, am "Graceful Logout"-Prozess teilzunehmen. Wenn Sie nur auf die Microsoft Windows-Plattform abzielen, ist dies alles, was Sie bereitstellen können und müssen. Idealerweise sollte Ihre Anwendung einen Shutdown-Dialog ähnlich dem folgenden bereitstellen:

A typical dialog on shutdown

Beispielcode für diesen Dialog finden Sie in der Dokumentation von QSessionManager::allowsInteraction().

Für eine vollständige Sitzungsverwaltung (die derzeit nur von X11R6 unterstützt wird), müssen Sie auch dafür sorgen, dass der Zustand der Anwendung gespeichert und möglicherweise im nächsten Lebenszyklus der Sitzung wiederhergestellt wird. Diese Speicherung erfolgt durch die Implementierung eines Slots, der mit dem Signal QGuiApplication::saveStateRequest() verbunden ist. Alle Zustandsdaten, die Sie in dieser Funktion speichern, sollten mit dem Sitzungsbezeichner QGuiApplication::sessionId() gekennzeichnet werden. Dieser anwendungsspezifische Bezeichner ist global eindeutig, so dass es zu keinen Überschneidungen kommen kann. (Siehe QSessionManager für Informationen zum Speichern/Wiederherstellen des Zustands einer bestimmten Qt-Anwendung).

Die Wiederherstellung wird normalerweise in der main()-Funktion der Anwendung durchgeführt. Prüfen Sie, ob QGuiApplication::isSessionRestored() true ist. Wenn dies der Fall ist, verwenden Sie erneut den Session Identifier QGuiApplication::sessionId(), um auf Ihre Statusdaten zuzugreifen und den Status der Anwendung wiederherzustellen.

Wichtig: Damit der Fenstermanager Fensterattribute wie die Stapelreihenfolge oder Geometrieinformationen wiederherstellen kann, müssen Sie Ihre Widgets der obersten Ebene mit eindeutigen anwendungsweiten Objektnamen identifizieren (siehe QObject::setObjectName()). Wenn Sie die Anwendung wiederherstellen, müssen Sie sicherstellen, dass alle wiederhergestellten Widgets der obersten Ebene dieselben eindeutigen Namen erhalten, die sie zuvor hatten.

Testen und Debuggen der Sitzungsverwaltung

Die Unterstützung für die Sitzungsverwaltung unter macOS und Windows ist aufgrund des Fehlens dieser Funktion im Betriebssystem selbst recht begrenzt. Beenden Sie einfach die Sitzung und überprüfen Sie, ob sich Ihre Anwendung wie erwartet verhält. Es kann sinnvoll sein, eine andere Anwendung zu starten, normalerweise die integrierte Entwicklungsumgebung, bevor Sie Ihre Anwendung starten. Diese andere Anwendung erhält dann die Meldung über das Herunterfahren, so dass Sie das Herunterfahren abbrechen können. Andernfalls müssten Sie sich nach jedem Testlauf erneut anmelden, was an sich kein Problem darstellt, aber zeitaufwändig ist.

Unter Unix können Sie entweder eine Desktop-Umgebung verwenden, die die standardmäßige X11R6-Sitzungsverwaltung unterstützt, oder, was die empfohlene Methode ist, die vom X-Konsortium bereitgestellte Referenzimplementierung des Sitzungsmanagers verwenden. Dieser Beispielmanager heißt xsm und ist Teil einer Standard-X11R6-Installation. Wie immer bei X11 gibt es eine nützliche und informative Handbuchseite. Die Verwendung von xsm ist unkompliziert (abgesehen von der unbeholfenen Athena-basierten Benutzeroberfläche). Hier ist ein einfacher Ansatz:

  • Starten Sie X11R6.
  • Erstellen Sie eine Punktdatei .xsmstartup in Ihrem Home-Verzeichnis, die die folgende Zeile enthält
    xterm

    Dies teilt xsm mit, dass die standardmäßige/fehlersichere Sitzung nur ein xterm ist und nichts anderes. Andernfalls würde xsm versuchen, eine Vielzahl von Clients aufzurufen, darunter auch den Windowmanager twm, was nicht sehr hilfreich ist.

  • Starten Sie nun xsm aus einem anderen Terminalfenster. Sowohl ein Sitzungsmanager-Fenster als auch das xterm werden angezeigt. Das xterm hat eine nette Eigenschaft, die es von allen anderen Shells, die Sie gerade ausführen, unterscheidet: Innerhalb seiner Shell verweist die Umgebungsvariable SESSION_MANAGER auf den Sitzungsmanager, den Sie gerade gestartet haben.
  • Starten Sie Ihre Anwendung aus dem neuen xterm-Fenster. Sie wird sich automatisch mit dem Sitzungsmanager verbinden. Sie können mit der Drucktaste ClientList überprüfen, ob die Verbindung erfolgreich war.

    Hinweis: Halten Sie die ClientList niemals offen, wenn Sie sitzungsverwaltete Clients starten oder beenden! Andernfalls wird xsm wahrscheinlich abstürzen.

  • Verwenden Sie die Schaltflächen Checkpoint und Shutdown des Sitzungsmanagers mit unterschiedlichen Einstellungen und sehen Sie, wie sich Ihre Anwendung verhält. Der Speichertyp local bedeutet, dass die Clients ihren Zustand speichern sollen. Er entspricht dem Signal QGuiApplication::saveStateRequest(). Der Speichertyp global fordert Anwendungen auf, ihre ungespeicherten Änderungen in einem permanenten, global zugänglichen Speicher zu speichern. Er ruft QGuiApplication::commitDataRequest() auf.
  • Wenn etwas abstürzt, geben Sie xsm die Schuld und nicht Qt. xsm ist weit davon entfernt, ein brauchbarer Sitzungsmanager auf dem Desktop eines Benutzers zu sein. Er ist jedoch stabil und nützlich genug, um als Testumgebung zu dienen.

© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.