QLockFile Class

QLockFile 类为使用文件的进程提供锁定功能。更多

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

公共类型

enum LockError { NoError, LockFailedError, PermissionError, UnknownError }

公共函数

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()

详细说明

锁文件可用于防止多个进程同时访问同一资源。例如,磁盘上的配置文件、套接字、端口、共享内存区域...

只有当所有访问共享资源的进程都使用具有相同文件路径的 QLockFile 时,序列化才能得到保证。

QLockFile 支持两种使用情况:为短期操作保护资源(例如,在保存新设置之前验证配置文件是否已更改),以及为资源(例如,用户在编辑器中打开的文档)提供无限期的长期保护。

在为短期操作提供保护时,可以调用lock() 并等待任何正在运行的操作结束。但在长时间保护资源时,应用程序应始终调用setStaleLockTime(0ms),然后在短暂超时后调用tryLock() ,以便向用户发出资源已被锁定的警告。

如果持有锁的进程崩溃,锁文件将保留在磁盘上,并阻止任何其他进程访问共享资源。因此,QLockFile 会根据写入文件的进程 ID 来检测这种 "过期 "的锁文件。为了避免进程 ID 在此期间被重复使用,我们会将当前进程名称与锁文件中与进程 ID 相对应的进程名称进行比较。如果进程名称不同,锁文件将被视为过时文件。此外,锁文件的最后修改时间(默认情况下为 30 秒,用于短时操作)也会被考虑在内。如果发现锁文件过期,就会将其删除。

因此,在长时间保护资源的情况下,应调用setStaleLockTime(0),当tryLock() 返回LockFailedError 时,通知用户该文件已被锁定,更多细节可使用getLockInfo() 查看。

注意: 在 Windows 系统中,如果机器的主机名包含 US-ASCII 字符集以外的字符,该类在检测过期锁时就会出现问题。

成员类型文档

enum QLockFile::LockError

该枚举描述了最后一次调用lock() 或tryLock() 的结果。

常量说明
QLockFile::NoError0已成功获取锁。
QLockFile::LockFailedError1无法获取锁,因为另一个进程持有该锁。
QLockFile::PermissionError2由于父目录权限不足,无法创建锁文件。
QLockFile::UnknownError3发生了其他错误,例如分区已满,无法写出锁文件。

成员函数文档

QLockFile::QLockFile(const QString &fileName)

构造一个新的锁定文件对象。对象是在解锁状态下创建的。调用lock() 或tryLock() 时,如果名为fileName 的锁文件还不存在,则将创建该文件。

另请参阅 lock() 和unlock()。

[noexcept] QLockFile::~QLockFile()

销毁锁定文件对象。如果锁定已被获取,则会通过删除锁定文件来释放锁定。

QLockFile::LockError QLockFile::error() const

返回锁定文件的错误状态。

如果tryLock() 返回false ,则可调用此函数找出锁定失败的原因。

QString QLockFile::fileName() const

返回锁定文件的文件名

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

读取锁文件当前所有者的信息。

如果tryLock() 返回false ,而error() 返回LockFailedError ,则可以调用此函数来查找有关现有锁文件的更多信息:

  • 应用程序的 PID(在pid 中返回)
  • 运行该文件的hostname (在网络文件系统中很有用)、
  • 创建该文件的应用程序名称(在appname 中返回)、

请注意,如果没有正在运行的具有此 PID 的应用程序,tryLock() 会自动删除文件,因此LockFailedError 只能在具有此 PID 的应用程序存在时才会发生(但也可能与此无关)。

这可以用来通知用户现有的锁文件,并让他们选择删除。使用removeStaleLockFile() 删除文件后,应用程序可以再次调用tryLock() 。

如果能成功检索到信息,该函数将返回true ;如果锁文件不存在或不包含预期数据,该函数将返回 false。如果在tryLock() 失败和调用该函数之间删除了锁文件,就会出现这种情况。如果出现这种情况,只需再次调用tryLock() 即可。

bool QLockFile::isLocked() const

如果锁是由QLockFile 实例获取的,则返回true ,否则返回false

另请参阅 lock()、unlock() 和tryLock()。

bool QLockFile::lock()

创建锁文件。

如果另一个进程(或另一个线程)已经创建了锁文件,此函数将阻塞,直到该进程(或线程)释放锁文件。

不允许同一线程在未解锁的情况下对同一锁多次调用此函数。当文件被递归锁定时,此函数将死锁

如果获得了锁,则返回true ;如果由于不可恢复的错误(如父目录中没有权限)而无法获得锁,则返回 false。

另请参阅 unlock() 和tryLock()。

bool QLockFile::removeStaleLockFile()

试图强制删除现有的锁文件。

在保护短时操作时,不建议调用此方法:QLockFile 已能在锁文件的时间超过staleLockTime() 时将其删除。

只有在长时间保护资源时,即使用staleLockTime(0)、tryLock() 返回LockFailedError 且用户同意删除锁文件后,才可调用此方法。

成功时返回true ,如果无法删除锁定文件,则返回 false。在 Windows 系统中,当拥有锁的应用程序仍在运行时,就会出现这种情况。

void QLockFile::setStaleLockTime(int staleLockTime)

staleLockTime 设置为锁定文件被视为过时的时间(毫秒)。默认值为 30000,即 30 秒。如果您的应用程序锁定文件的时间通常超过 30 秒(例如保存 2 分钟的百万字节数据),则应使用 setStaleLockTime() 设置一个更大的值。

staleLockTime 的值由lock() 和tryLock() 使用,以确定现有锁定文件何时被视为过期文件,即由崩溃进程遗留下来的文件。这对于 PID 被重复使用的情况非常有用,因此检测过期锁文件的一种方法就是看它是否存在了很长时间。

这是一个重载函数,等同于调用:

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

另请参见 staleLockTime().

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

将锁定文件被视为过期的时间间隔设置为staleLockTime 。默认值为 30 秒。

如果您的应用程序锁定文件的时间通常超过 30 秒(例如保存 2 分钟的兆字节数据),则应使用 setStaleLockTime() 设置更大的值。

staleLockTime() 的值会被lock() 和tryLock() 使用,以确定现有锁定文件何时被视为陈旧文件,即崩溃进程遗留下来的文件。这在 PID 被重复使用的情况下非常有用,因此检测过期锁文件的一种方法就是看它是否存在了很长时间。

此函数在 Qt 6.2 中引入。

另请参见 staleLockTime()。

int QLockFile::staleLockTime() const

以毫秒为单位返回锁文件被视为过时的时间。

另请参阅 setStaleLockTime()。

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

这是一个重载函数。

返回一个 std::chrono::milliseconds 对象,表示锁文件被视为过时的时间。

此函数在 Qt 6.2 中引入。

另请参阅 setStaleLockTime().

bool QLockFile::tryLock(int timeout)

尝试创建锁定文件。如果获得了锁,则返回true ;否则返回false 。如果另一个进程(或另一个线程)已经创建了锁文件,则此函数将最多等待timeout 毫秒,直到锁文件可用。

注意:如果timeout 为负数,则等同于调用lock() ,也就是说,如果timeout 为负数,则此函数将永远等待,直到锁文件可以锁定为止。

如果已获得锁,则必须在另一个进程(或线程)成功锁定该文件之前使用unlock() 释放该锁。

不允许在未解锁的情况下从同一线程对同一锁多次调用此函数,当尝试递归锁定文件时,此函数将始终返回 false。

另请参阅 lock() 和unlock()。

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

这是一个重载函数。

尝试创建锁文件。如果获得了锁,则返回true ;否则返回false 。如果另一个进程(或另一个线程)已经创建了锁文件,则该函数将最多等待timeout ,直到锁文件可用。

如果已获得锁,则必须在另一个进程(或线程)成功锁定该文件前使用unlock() 释放该锁。

不允许在未解锁的情况下从同一线程对同一锁多次调用此函数,当尝试递归锁定文件时,此函数将始终返回 false。

此函数在 Qt 6.2 中引入。

另请参阅 lock() 和unlock()。

void QLockFile::unlock()

删除锁定文件,释放锁定。

在未锁定文件的情况下调用 unlock() 则不起任何作用。

另请参阅 lock() 和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.