QLockFile 类
QLockFile 类通过文件在进程之间提供锁定机制。 更多...
头文件 | #include <QLockFile> |
CMake | find_package(Qt6 REQUIRED COMPONENTS Core) target_link_libraries(mytarget PRIVATE Qt6::Core) |
qmake | QT += core |
公共类型
枚举 | 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字符集之外的字符,此类将有问题地检测到过时的锁。
成员类型文档
枚举 QLockFile::LockError
此枚举描述了最后调用 lock() 或 tryLock() 的结果。
常量 | 值 | 描述 |
---|---|---|
QLockFile::NoError | 0 | 成功获取了锁。 |
QLockFile::LockFailedError | 1 | 无法获取锁,因为其他进程持有它。 |
QLockFile::PermissionError | 2 | 由于父目录权限不足,无法创建锁文件。 |
QLockFile::UnknownError | 3 | 发生其他错误,例如已满的分区阻止写入锁文件。 |
成员函数文档
QLockFile::QLockFile(const QString &fileName)
构建一个新的锁文件对象。对象以未加锁状态创建。调用 lock() 或 tryLock() 时,将创建一个名为 fileName 的锁文件,如果该文件尚不存在。
[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,则此函数可以用来查找关于现有锁定文件更多的信息。
- 应用程序的进程ID(在pid中返回)
- 它运行的hostname(在网络文件系统中很有用),
- 创建它的应用程序的名称(在appname中返回),
请注意,如果tryLock()在没有与该PID关联的运行应用程序的情况下自动删除了文件,则只会发生LockFailedError(尽管可能与它无关)。
这可以用来通知用户有关现有锁定文件,并让他们选择删除它。在调用removeStaleLockFile()删除文件后,应用程序可以再次调用tryLock()。
此函数如果在成功检索信息时返回true
,则在锁定文件不存在或不包含预期数据时返回false。这可能会在tryLock()失败和调用此函数之间的某个时刻发生锁定文件被删除。在这种情况下,只需再次调用tryLock()即可。
bool QLockFile::isLocked() const
如果由该QLockFile实例获取了锁定,则返回true
,否则返回false
。
另请参阅lock(),unlock()和tryLock()。
bool QLockFile::lock()
创建锁定文件。
如果其他进程(或线程)已创建了锁定文件,则此函数会阻塞,直到该进程(或线程)释放它。
不允许从同一线程重复调用此函数锁定相同的对象而未先解锁。当文件通过递归锁定时,此函数将造成死锁。
如果成功获取锁定,则返回true
;如果没有获得锁定,则返回false,这可能是因为权限问题等不可恢复的错误。
bool QLockFile::removeStaleLockFile()
尝试强行删除现有锁定文件。
当保护短暂操作时,不推荐调用此函数:QLockFile已处理在比staleLockTime老的锁定文件之后删除锁定文件。
当长时间保护资源时(即,使用staleLockTime(0)),以及在调用tryLock()返回LockFailedError并且用户同意删除锁定文件后,应该调用此方法。
如果成功则返回true
,如果无法删除锁定文件则返回false。这种情况在Windows中发生,当时拥有锁定文件的应用程序还在运行。
void QLockFile::setStaleLockTime(int staleLockTime)
将 staleLockTime 设置为认为锁文件过时的毫秒数。默认值是 30000,即 30 秒。如果您的应用程序通常锁定文件超过 30 秒(例如,在两分钟内保存几兆字节数据),则应使用 setStaleLockTime() 设置一个更大的值。
staleLockTime 的值被 lock() 和 tryLock() 使用,以确定现有锁文件何时被视为过时,即由崩溃的进程留下的。这在 PID 同时被重新使用的场合很有用,因此检测过时锁文件的一种方法是根据其存在时间过长这一事实。
这是一个重载函数,等价于调用
setStaleLockTime(std::chrono::milliseconds{staleLockTime});
另请参阅 staleLockTime().
[since 6.2]
void QLockFile::setStaleLockTime(std::chrono::milliseconds staleLockTime)
设置认为锁文件过时的间隔到 staleLockTime。默认值是 30 秒。
如果您的应用程序通常锁定文件超过 30 秒(例如,在两分钟内保存几兆字节数据),则应使用 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。
[自6.2以来]
bool QLockFile::tryLock(std::chrono::milliseconds timeout = std::chrono::milliseconds::zero())
这是一个重载函数。
尝试创建锁文件。此函数在成功获得锁时返回 true
,否则返回 false
。如果另一个进程(或另一个线程)已经创建了锁文件,则此函数将最多等待 timeout 时间,直到锁文件可用。
获取锁之后,必须使用 unlock() 释放锁,以便其他进程(或线程)可以成功锁定它。
不允许从同一线程对同一锁多次调用此函数而不先解锁,此函数在尝试递归锁定文件时将 总是 返回 false。
此函数自 Qt 6.2 起引入。
void QLockFile::unlock()
通过删除锁文件来释放锁。
在锁定文件之前调用 unlock() 不会有任何作用。
© 2024 Qt公司有限公司。本文档中的文档贡献归其所有者所有版权。所提供的文档根据自由软件基金会发布的 GNU自由文档许可第1.3版 的条款许可。Qt及其相关商标是Qt公司(芬兰)及其在全球的子公司和关联公司的商标。所有其他商标均为其所有者的财产。