QLockFile Class

Die Klasse QLockFile ermöglicht das Sperren zwischen Prozessen unter Verwendung einer Datei. Mehr...

Kopfzeile: #include <QLockFile>
CMake: find_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake: QT += core

Öffentliche Typen

enum LockError { NoError, LockFailedError, PermissionError, UnknownError }

Öffentliche Funktionen

QLockFile(const QString &fileName)
~QLockFile()
QLockFile::LockError error() const
QString fileName() const
bool getLockInfo(qint64 *pid, QString *hostname, QString *appname) const
bool isLocked() const
bool lock()
bool removeStaleLockFile()
void setStaleLockTime(int staleLockTime)
(since 6.2) void setStaleLockTime(std::chrono::milliseconds staleLockTime)
int staleLockTime() const
(since 6.2) std::chrono::milliseconds staleLockTimeAsDuration() const
bool tryLock(int timeout)
(since 6.2) bool tryLock(std::chrono::milliseconds timeout = std::chrono::milliseconds::zero())
void unlock()

Detaillierte Beschreibung

Eine Lock-Datei kann verwendet werden, um zu verhindern, dass mehrere Prozesse gleichzeitig auf dieselbe Ressource zugreifen. Zum Beispiel eine Konfigurationsdatei auf der Festplatte, oder ein Socket, ein Port, ein Bereich des gemeinsamen Speichers...

Die Serialisierung ist nur gewährleistet, wenn alle Prozesse, die auf die gemeinsame Ressource zugreifen, QLockFile mit demselben Dateipfad verwenden.

QLockFile unterstützt zwei Anwendungsfälle: den Schutz einer Ressource für eine kurzfristige Operation (z.B. die Überprüfung, ob sich eine Konfigurationsdatei geändert hat, bevor neue Einstellungen gespeichert werden) und den dauerhaften Schutz einer Ressource (z.B. ein Dokument, das von einem Benutzer in einem Editor geöffnet wurde) für eine unbestimmte Zeitspanne.

Beim Schutz für einen kurzfristigen Vorgang ist es akzeptabel, lock() aufzurufen und zu warten, bis ein laufender Vorgang beendet ist. Beim Schutz einer Ressource über einen längeren Zeitraum sollte die Anwendung jedoch immer setStaleLockTime(0ms) und dann tryLock() mit einem kurzen Timeout aufrufen, um den Benutzer zu warnen, dass die Ressource gesperrt ist.

Wenn der Prozess, der die Sperre hält, abstürzt, bleibt die Sperrdatei auf der Festplatte und kann jeden anderen Prozess daran hindern, jemals auf die gemeinsame Ressource zuzugreifen. Aus diesem Grund versucht QLockFile, eine solche "veraltete" Sperrdatei zu erkennen, basierend auf der in die Datei geschriebenen Prozess-ID. Um die Situation abzudecken, dass die Prozess-ID in der Zwischenzeit wiederverwendet wurde, wird der aktuelle Prozessname mit dem Namen des Prozesses verglichen, der der Prozess-ID aus der Lock-Datei entspricht. Wenn sich die Prozessnamen unterscheiden, wird die Sperrdatei als veraltet betrachtet. Zusätzlich wird die letzte Änderungszeit der Sperrdatei (standardmäßig 30s, für den Anwendungsfall einer kurzlebigen Operation) berücksichtigt. Wird die Sperrdatei als veraltet eingestuft, wird sie gelöscht.

Für den Anwendungsfall, eine Ressource über einen langen Zeitraum zu schützen, sollten Sie daher setStaleLockTime(0) aufrufen und, wenn tryLock() LockFailedError zurückgibt, den Benutzer darüber informieren, dass das Dokument gesperrt ist, möglicherweise unter Verwendung von getLockInfo() für weitere Details.

Hinweis: Unter Windows hat diese Klasse Probleme, eine veraltete Sperre zu erkennen, wenn der Hostname des Rechners Zeichen außerhalb des US-ASCII-Zeichensatzes enthält.

Dokumentation der Mitgliedstypen

enum QLockFile::LockError

Diese Aufzählung beschreibt das Ergebnis des letzten Aufrufs von lock() oder tryLock().

KonstanteWertBeschreibung
QLockFile::NoError0Die Sperre wurde erfolgreich erworben.
QLockFile::LockFailedError1Die Sperre konnte nicht erworben werden, da ein anderer Prozess sie hält.
QLockFile::PermissionError2Die Sperrdatei konnte nicht erstellt werden, weil im übergeordneten Verzeichnis keine Berechtigungen vorhanden sind.
QLockFile::UnknownError3Es ist ein anderer Fehler aufgetreten, z.B. hat eine volle Partition das Schreiben der Sperrdatei verhindert.

Dokumentation der Mitgliedsfunktionen

QLockFile::QLockFile(const QString &fileName)

Konstruiert ein neues Lockfile-Objekt. Das Objekt wird in einem nicht gesperrten Zustand erstellt. Beim Aufruf von lock() oder tryLock() wird eine Sperrdatei mit dem Namen fileName erstellt, sofern sie nicht bereits existiert.

Siehe auch lock() und unlock().

[noexcept] QLockFile::~QLockFile()

Zerstört das Objekt der Sperrdatei. Wenn die Sperre erworben wurde, wird die Sperre freigegeben, indem die Sperrdatei gelöscht wird.

QLockFile::LockError QLockFile::error() const

Gibt den Fehlerstatus der Sperrdatei zurück.

Wenn tryLock() false zurückgibt, kann diese Funktion aufgerufen werden, um den Grund für das Scheitern der Sperrung herauszufinden.

QString QLockFile::fileName() const

Gibt den Dateinamen der Sperrdatei zurück

bool QLockFile::getLockInfo(qint64 *pid, QString *hostname, QString *appname) const

Ruft Informationen über den aktuellen Besitzer der Sperrdatei ab.

Wenn tryLock() false zurückgibt und error() LockFailedError zurückgibt, kann diese Funktion aufgerufen werden, um weitere Informationen über die vorhandene Sperrdatei zu erhalten:

  • die PID der Anwendung (zurückgegeben in pid)
  • die hostname, auf der sie läuft (nützlich im Falle von vernetzten Dateisystemen)
  • den Namen der Anwendung, die sie erstellt hat (zurückgegeben in appname),

Beachten Sie, dass tryLock() die Datei automatisch gelöscht hat, wenn es keine laufende Anwendung mit dieser PID gibt. LockFailedError kann also nur ausgeführt werden, wenn es eine Anwendung mit dieser PID gibt (sie könnte aber auch unabhängig davon sein).

Dies kann verwendet werden, um Benutzer über die vorhandene Sperrdatei zu informieren und ihnen die Möglichkeit zu geben, sie zu löschen. Nachdem die Datei mit removeStaleLockFile() gelöscht wurde, kann die Anwendung erneut tryLock() aufrufen.

Diese Funktion gibt true zurück, wenn die Informationen erfolgreich abgerufen werden konnten, false, wenn die Sperrdatei nicht existiert oder nicht die erwarteten Daten enthält. Dies kann passieren, wenn die Sperrdatei zwischen dem Zeitpunkt, an dem tryLock() fehlgeschlagen ist, und dem Aufruf dieser Funktion gelöscht wurde. Rufen Sie in diesem Fall einfach tryLock() erneut auf.

bool QLockFile::isLocked() const

Gibt true zurück, wenn die Sperre von dieser QLockFile Instanz erworben wurde, andernfalls false.

Siehe auch lock(), unlock(), und tryLock().

bool QLockFile::lock()

Erzeugt die Sperrdatei.

Wenn ein anderer Prozeß (oder ein anderer Thread) die Sperrdatei bereits erstellt hat, blockiert diese Funktion, bis dieser Prozeß (oder Thread) sie freigibt.

Es ist nicht erlaubt, diese Funktion mehrfach für dieselbe Sperre vom selben Thread aus aufzurufen, ohne sie vorher zu entsperren. Diese Funktion blockiert, wenn die Datei rekursiv gesperrt wird.

Gibt true zurück, wenn die Sperre erlangt wurde, false, wenn sie aufgrund eines nicht behebbaren Fehlers nicht erlangt werden konnte, wie z. B. fehlende Berechtigungen im übergeordneten Verzeichnis.

Siehe auch unlock() und tryLock().

bool QLockFile::removeStaleLockFile()

Versucht, eine bestehende Sperrdatei gewaltsam zu entfernen.

Der Aufruf dieser Methode wird nicht empfohlen, wenn eine kurzlebige Operation geschützt werden soll: QLockFile kümmert sich bereits um das Entfernen von Sperrdateien, nachdem sie älter als staleLockTime() sind.

Diese Methode sollte nur aufgerufen werden, wenn eine Ressource über einen längeren Zeitraum geschützt wird, d. h. mit staleLockTime(0) und nachdem tryLock() LockFailedError zurückgegeben hat und der Benutzer dem Entfernen der Sperrdatei zugestimmt hat.

Gibt bei Erfolg true zurück, false, wenn die Sperrdatei nicht entfernt werden konnte. Dies geschieht unter Windows, wenn die Anwendung, die die Sperre besitzt, noch läuft.

void QLockFile::setStaleLockTime(int staleLockTime)

Setzt staleLockTime auf die Zeit in Millisekunden, nach der eine Sperrdatei als veraltet gilt. Der Standardwert ist 30000, d.h. 30 Sekunden. Wenn Ihre Anwendung die Datei in der Regel länger als 30 Sekunden gesperrt hält (z. B. beim Speichern von Megabytes an Daten für 2 Minuten), sollten Sie mit setStaleLockTime() einen größeren Wert festlegen.

Der Wert von staleLockTime wird von lock() und tryLock() verwendet, um zu bestimmen, wann eine bestehende Sperrdatei als veraltet gilt, d.h. von einem abgestürzten Prozess übrig geblieben ist. Dies ist nützlich für den Fall, dass die PID in der Zwischenzeit wiederverwendet wurde, so dass eine Möglichkeit, eine veraltete Sperrdatei zu erkennen, darin besteht, dass sie schon lange vorhanden ist.

Dies ist eine überladene Funktion, die einem Aufruf entspricht:

setStaleLockTime(std::chrono::milliseconds{staleLockTime});

Siehe auch staleLockTime().

[since 6.2] void QLockFile::setStaleLockTime(std::chrono::milliseconds staleLockTime)

Setzt das Intervall, nach dem eine Sperrdatei als veraltet gilt, auf staleLockTime. Der Standardwert ist 30 Sekunden.

Wenn Ihre Anwendung die Datei in der Regel länger als 30 Sekunden gesperrt hält (z. B. beim Speichern von Megabytes an Daten für 2 Minuten), sollten Sie mit setStaleLockTime() einen größeren Wert festlegen.

Der Wert von staleLockTime() wird von lock() und tryLock() verwendet, um zu bestimmen, wann eine bestehende Sperrdatei als veraltet gilt, d.h. von einem abgestürzten Prozess übrig geblieben ist. Dies ist nützlich für den Fall, dass die PID zwischenzeitlich wiederverwendet wurde, so dass eine Möglichkeit, eine veraltete Lock-Datei zu erkennen, die Tatsache ist, dass sie schon lange existiert.

Diese Funktion wurde in Qt 6.2 eingeführt.

Siehe auch staleLockTime().

int QLockFile::staleLockTime() const

Gibt die Zeit in Millisekunden zurück, nach der eine Sperrdatei als veraltet gilt.

Siehe auch setStaleLockTime().

[since 6.2] std::chrono::milliseconds QLockFile::staleLockTimeAsDuration() const

Dies ist eine überladene Funktion.

Gibt ein std::chrono::milliseconds-Objekt zurück, das die Zeit angibt, nach der eine Sperrdatei als veraltet gilt.

Diese Funktion wurde in Qt 6.2 eingeführt.

Siehe auch setStaleLockTime().

bool QLockFile::tryLock(int timeout)

Versucht, die Sperrdatei zu erstellen. Diese Funktion gibt true zurück, wenn die Sperre erhalten wurde; andernfalls gibt sie false zurück. Wenn ein anderer Prozess (oder ein anderer Thread) die Sperrdatei bereits erstellt hat, wartet diese Funktion höchstens timeout Millisekunden, bis die Sperrdatei verfügbar wird.

Hinweis: Die Übergabe einer negativen Zahl als timeout ist gleichbedeutend mit dem Aufruf von lock(), d.h. diese Funktion wird ewig warten, bis die Sperrdatei gesperrt werden kann, wenn timeout negativ ist.

Wenn die Sperre erhalten wurde, muss sie mit unlock() freigegeben werden, bevor ein anderer Prozess (oder Thread) sie erfolgreich sperren kann.

Es ist nicht erlaubt, diese Funktion mehrmals für dieselbe Sperre vom selben Thread aus aufzurufen, ohne die Sperre vorher aufzuheben; diese Funktion gibt immer false zurück, wenn versucht wird, die Datei rekursiv zu sperren.

Siehe auch lock() und unlock().

[since 6.2] bool QLockFile::tryLock(std::chrono::milliseconds timeout = std::chrono::milliseconds::zero())

Dies ist eine überladene Funktion.

Versucht, die Sperrdatei zu erstellen. Diese Funktion gibt true zurück, wenn die Sperre erhalten wurde; andernfalls gibt sie false zurück. Wenn ein anderer Prozess (oder ein anderer Thread) die Sperrdatei bereits erstellt hat, wartet diese Funktion höchstens timeout, bis die Sperrdatei verfügbar ist.

Wenn die Sperre erhalten wurde, muss sie mit unlock() freigegeben werden, bevor ein anderer Prozess (oder Thread) sie erfolgreich sperren kann.

Es ist nicht erlaubt, diese Funktion mehrfach für dieselbe Sperre vom selben Thread aus aufzurufen, ohne sie vorher zu entsperren. Diese Funktion gibt immer false zurück, wenn versucht wird, die Datei rekursiv zu sperren.

Diese Funktion wurde in Qt 6.2 eingeführt.

Siehe auch lock() und unlock().

void QLockFile::unlock()

Hebt die Sperre auf, indem die Sperrdatei gelöscht wird.

Der Aufruf von unlock(), ohne die Datei vorher zu sperren, bewirkt nichts.

Siehe auch lock() und tryLock().

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