Auf dieser Seite

Sitzungsverwaltung

Eine Sitzung ist eine Gruppe laufender Anwendungen, von denen jede einen bestimmten Zustand aufweist. Die Sitzung wird von einem Dienst gesteuert, der als Sitzungsmanager bezeichnet wird. Die an der Sitzung teilnehmenden Anwendungen werden als Sitzungs-Clients bezeichnet.

Der Sitzungsmanager gibt im Auftrag des Benutzers Befehle an seine Clients aus. Diese Befehle können dazu führen, dass Clients ungespeicherte Änderungen übernehmen (beispielsweise durch das Speichern geöffneter Dateien), ihren Zustand für zukünftige Sitzungen beibehalten oder ordnungsgemäß beendet werden. Die Gesamtheit dieser Vorgänge wird als Sitzungsverwaltung bezeichnet.

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

Beenden einer Sitzung

Eine Sitzung wird vom Sitzungsmanager beendet, in der Regel im Auftrag des Benutzers, wenn dieser sich abmelden möchte. Ein System kann in einer Notsituation auch ein automatisches Herunterfahren durchführen, beispielsweise wenn ein Stromausfall droht. Es besteht offensichtlich ein wesentlicher Unterschied zwischen diesen beiden Arten des Beendens. Im ersten Fall möchte der Benutzer möglicherweise mit der Anwendung interagieren und genau festlegen, welche Dateien gespeichert und welche verworfen werden sollen. Im zweiten 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 in 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 den „Ruhezustand“ an, bei dem der gesamte Arbeitsspeicher auf die Festplatte gespeichert und beim Neustart des Rechners wiederhergestellt wird.) Sie unterstützen jedoch ein ordnungsgemäßes Abmelden, bei dem Anwendungen die Möglichkeit haben, den Vorgang nach Erhalt einer Bestätigung durch den Benutzer abzubrechen. Dies ist die Funktionalität, die dem Signal „ QGuiApplication::commitDataRequest()“ entspricht.

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

Einrichtung der Sitzungsverwaltung mit Qt

Verbinden Sie zunächst einen Slot mit dem Signal ` QGuiApplication::commitDataRequest()`, damit Ihre Anwendung am ordnungsgemäßen Abmeldevorgang teilnehmen kann. Wenn Sie ausschließlich die Microsoft Windows-Plattform ansprechen, ist dies alles, was Sie bereitstellen können und müssen. Idealerweise sollte Ihre Anwendung einen Beendigungsdialog bereitstellen, der in etwa wie folgt aussieht:

Ein typischer Dialog beim Herunterfahren

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

Für eine vollständige Sitzungsverwaltung (derzeit nur unter X11R6 unterstützt) müssen Sie sich außerdem um das Speichern des Anwendungszustands und gegebenenfalls um dessen Wiederherstellung im nächsten Lebenszyklus der Sitzung kümmern. 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 der Sitzungskennung QGuiApplication::sessionId() gekennzeichnet werden. Diese anwendungsspezifische Kennung ist global eindeutig, sodass keine Konflikte auftreten. (Informationen zum Speichern und Wiederherstellen des Zustands einer bestimmten Qt-Anwendung finden Sie unter QSessionManager.)

Die Wiederherstellung erfolgt in der Regel in der `main()`-Funktion der Anwendung. Prüfen Sie, ob ` QGuiApplication::isSessionRestored()` gleich ` true` ist. Ist dies der Fall, verwenden Sie erneut die Sitzungskennung ` QGuiApplication::sessionId()` für den Zugriff auf Ihre Zustandsdaten und stellen Sie den Zustand der Anwendung wieder her.

Wichtig: Damit der Fenstermanager Fensterattribute wie die Stapelreihenfolge oder Geometrieinformationen wiederherstellen kann, müssen Sie Ihre Widgets der obersten Ebene mit eindeutigen, anwendungsweiten Objektnamen kennzeichnen (siehe ` QObject::setObjectName()`). Bei der Wiederherstellung der Anwendung 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 fehlender Funktionen im Betriebssystem selbst recht eingeschränkt. Beenden Sie die Sitzung einfach und überprüfen Sie, ob sich Ihre Anwendung wie erwartet verhält. Es kann sinnvoll sein, vor dem Start Ihrer Anwendung eine andere Anwendung – in der Regel die integrierte Entwicklungsumgebung – zu starten. Diese andere Anwendung erhält anschließend die Beendigungsmeldung, sodass Sie die Beendigung abbrechen können. Andernfalls müssten Sie sich nach jedem Testlauf erneut anmelden, was an sich kein Problem darstellt, aber zeitaufwendig ist.

Unter Unix können Sie entweder eine Desktop-Umgebung verwenden, die die Standard-X11R6-Sitzungsverwaltung unterstützt, oder – was die empfohlene Methode ist – die vom X Consortium bereitgestellte Referenzimplementierung des Sitzungsmanagers nutzen. Dieser Beispiel-Manager heißt „ xsm “ und ist Teil einer Standard-X11R6-Installation. Wie immer bei X11 steht eine nützliche und informative Handbuchseite zur Verfügung. Die Verwendung von „ xsm “ ist unkompliziert (abgesehen von der umständlichen, auf Athena basierenden Benutzeroberfläche). Hier ist eine einfache Vorgehensweise:

  • Starten Sie X11R6.
  • Erstellen Sie in Ihrem Home-Verzeichnis eine Dot-Datei namens „ .xsmstartup “, die die folgende einzelne Zeile enthält:
    xterm

    Dadurch wird „ xsm “ mitgeteilt, dass die Standard-/Failsafe-Sitzung lediglich aus einem xterm besteht und aus nichts anderem. Andernfalls würde „ xsm “ versuchen, zahlreiche Clients aufzurufen, darunter den Fenstermanager „ twm “, was nicht besonders hilfreich ist.

  • Starten Sie nun xsm aus einem anderen Terminalfenster. Es erscheinen sowohl ein Fenster des Sitzungsmanagers als auch das xterm. Das xterm hat eine nützliche Eigenschaft, die es von allen anderen derzeit ausgeführten Shells unterscheidet: Innerhalb dieser Shell verweist die Umgebungsvariable SESSION_MANAGER auf den gerade gestarteten Sitzungsmanager.
  • Starten Sie Ihre Anwendung aus dem neuen xterm-Fenster heraus. Sie verbindet sich automatisch mit dem Sitzungsmanager. Mit der Schaltfläche „ClientList“ können Sie überprüfen, ob die Verbindung erfolgreich hergestellt wurde.

    Hinweis: Lassen Sie „ClientList“niemals geöffnet, wenn Sie vom Sitzungsmanager verwaltete Clients starten oder beenden! Andernfalls stürzt „ xsm “ wahrscheinlich ab.

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

© 2026 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.