QLockFile Class
La clase QLockFile provee bloqueo entre procesos usando un archivo. Más...
| Cabecera: | #include <QLockFile> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS Core)target_link_libraries(mytarget PRIVATE Qt6::Core) |
| qmake: | QT += core |
- Lista de todos los miembros, incluyendo los heredados
- QLockFile es parte de Entrada/Salida y Redes.
Tipos Públicos
| enum | LockError { NoError, LockFailedError, PermissionError, UnknownError } |
Funciones Públicas
| 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() |
Descripción Detallada
Un archivo de bloqueo se puede utilizar para evitar que varios procesos accedan simultáneamente al mismo recurso. Por ejemplo, un archivo de configuración en disco, o un socket, un puerto, una región de memoria compartida...
La serialización sólo está garantizada si todos los procesos que acceden al recurso compartido utilizan QLockFile, con la misma ruta de archivo.
QLockFile soporta dos casos de uso: proteger un recurso para una operación a corto plazo (por ejemplo, verificar si un archivo de configuración ha cambiado antes de guardar la nueva configuración), y para la protección a largo plazo de un recurso (por ejemplo, un documento abierto por un usuario en un editor) por un tiempo indefinido.
Cuando se protege para una operación a corto plazo, es aceptable llamar a lock() y esperar hasta que finalice cualquier operación en ejecución. Sin embargo, cuando se protege un recurso durante un tiempo prolongado, la aplicación debe llamar siempre a setStaleLockTime(0ms) y después a tryLock() con un tiempo de espera corto, para advertir al usuario de que el recurso está bloqueado.
Si el proceso que mantiene el bloqueo se bloquea, el fichero de bloqueo permanece en el disco y puede impedir que cualquier otro proceso acceda al recurso compartido, nunca. Por esta razón, QLockFile intenta detectar un fichero de bloqueo "obsoleto", basándose en el ID del proceso escrito en el fichero. Para cubrir la situación de que el ID del proceso se haya reutilizado mientras tanto, el nombre del proceso actual se compara con el nombre del proceso que corresponde al ID del proceso del fichero de bloqueo. Si los nombres de los procesos difieren, el fichero de bloqueo se considera obsoleto. Además, se tiene en cuenta la última hora de modificación del fichero de bloqueo (30s por defecto, para el caso de uso de una operación de corta duración). Si el archivo de bloqueo se considera obsoleto, se eliminará.
Para el caso de uso de proteger un recurso durante mucho tiempo, debería por tanto llamar a setStaleLockTime(0), y cuando tryLock() devuelva LockFailedError, informar al usuario de que el documento está bloqueado, posiblemente utilizando getLockInfo() para más detalles.
Nota: En Windows, esta clase tiene problemas para detectar un bloqueo antiguo si el nombre de host de la máquina contiene caracteres fuera del juego de caracteres US-ASCII.
Documentación de tipos de miembros
enum QLockFile::LockError
Este enum describe el resultado de la última llamada a lock() o tryLock().
| Constante | Valor | Descripción |
|---|---|---|
QLockFile::NoError | 0 | El bloqueo fue adquirido con éxito. |
QLockFile::LockFailedError | 1 | No se ha podido adquirir el bloqueo porque lo tiene otro proceso. |
QLockFile::PermissionError | 2 | No se pudo crear el fichero de bloqueo, por falta de permisos en el directorio padre. |
QLockFile::UnknownError | 3 | Ha ocurrido otro error, por ejemplo, una partición llena ha impedido escribir el fichero de bloqueo. |
Documentación de las funciones miembro
[explicit] QLockFile::QLockFile(const QString &fileName)
Construye un nuevo objeto de archivo de bloqueo. El objeto se crea en estado desbloqueado. Al llamar a lock() o tryLock(), se creará un archivo de bloqueo llamado fileName, si no existe ya.
Véase también lock() y unlock().
[noexcept] QLockFile::~QLockFile()
Destruye el objeto archivo de bloqueo. Si el bloqueo fue adquirido, esto liberará el bloqueo, borrando el archivo de bloqueo.
QLockFile::LockError QLockFile::error() const
Devuelve el estado de error del archivo de bloqueo.
Si tryLock() devuelve false, se puede llamar a esta función para averiguar la razón por la que falló el bloqueo.
QString QLockFile::fileName() const
Devuelve el nombre del archivo de bloqueo
bool QLockFile::getLockInfo(qint64 *pid, QString *hostname, QString *appname) const
Recupera información sobre el propietario actual del archivo de bloqueo.
Si tryLock() devuelve false, y error() devuelve LockFailedError, se puede llamar a esta función para obtener más información sobre el archivo de bloqueo existente:
- el PID de la aplicación (devuelto en pid)
- el hostname en el que se está ejecutando (útil en caso de sistemas de archivos en red),
- el nombre de la aplicación que lo creó (devuelto en appname),
Tenga en cuenta que tryLock() borra automáticamente el archivo si no hay ninguna aplicación en ejecución con este PID, por lo que LockFailedError sólo puede ocurrir si hay una aplicación con este PID (aunque podría no estar relacionada).
Esto se puede utilizar para informar a los usuarios sobre el archivo de bloqueo existente y darles la opción de eliminarlo. Después de eliminar el fichero utilizando removeStaleLockFile(), la aplicación puede llamar de nuevo a tryLock().
Esta función devuelve true si la información pudo ser recuperada con éxito, false si el fichero de bloqueo no existe o no contiene los datos esperados. Esto puede ocurrir si el archivo de bloqueo fue borrado entre el momento en que tryLock() falló y la llamada a esta función. Simplemente llame a tryLock() de nuevo si esto sucede.
bool QLockFile::isLocked() const
Devuelve true si el bloqueo fue adquirido por esta instancia QLockFile, en caso contrario devuelve false.
Véase también lock(), unlock(), y tryLock().
bool QLockFile::lock()
Crea el fichero de bloqueo.
Si otro proceso (u otro hilo) ya ha creado el archivo de bloqueo, esta función se bloqueará hasta que ese proceso (o hilo) lo libere.
No está permitido llamar a esta función varias veces sobre el mismo bloqueo desde el mismo hilo sin desbloquear primero. Esta función se bloqueará cuando el archivo se bloquee recursivamente.
Devuelve true si el bloqueo fue adquirido, false si no pudo ser adquirido debido a un error irrecuperable, como la falta de permisos en el directorio padre.
Véase también unlock() y tryLock().
bool QLockFile::removeStaleLockFile()
Intenta eliminar por la fuerza un archivo de bloqueo existente.
No se recomienda llamar a este método cuando se protege una operación de corta duración: QLockFile ya se encarga de eliminar los archivos de bloqueo después de que sean más antiguos que staleLockTime().
Este método sólo debería llamarse cuando se protege un recurso durante mucho tiempo, es decir, con staleLockTime(0), y después de que tryLock() devolviera LockFailedError, y el usuario estuviera de acuerdo en eliminar el archivo de bloqueo.
Devuelve true en caso de éxito, false si el archivo de bloqueo no pudo ser eliminado. Esto ocurre en Windows, cuando la aplicación propietaria del bloqueo sigue ejecutándose.
void QLockFile::setStaleLockTime(int staleLockTime)
Establece staleLockTime como el tiempo en milisegundos tras el cual un archivo de bloqueo se considera obsoleto. El valor por defecto es 30000, es decir, 30 segundos. Si tu aplicación suele mantener el archivo bloqueado durante más de 30 segundos (por ejemplo, al guardar megabytes de datos durante 2 minutos), debes establecer un valor mayor utilizando setStaleLockTime().
El valor de staleLockTime es utilizado por lock() y tryLock() para determinar cuándo un fichero de bloqueo existente se considera obsoleto, es decir, dejado por un proceso que se ha bloqueado. Esto es útil para el caso en que el PID se reutilizó mientras tanto, por lo que una forma de detectar un archivo de bloqueo antiguo es por el hecho de que ha existido durante mucho tiempo.
Esta es una función sobrecargada, equivalente a llamar a:
setStaleLockTime(std::chrono::milliseconds{staleLockTime});
Véase también staleLockTime().
[since 6.2] void QLockFile::setStaleLockTime(std::chrono::milliseconds staleLockTime)
Establece el intervalo tras el cual un archivo bloqueado se considera obsoleto en staleLockTime. El valor por defecto es 30s.
Si tu aplicación suele mantener el archivo bloqueado durante más de 30 segundos (por ejemplo, al guardar megabytes de datos durante 2 minutos), debes establecer un valor mayor mediante setStaleLockTime().
El valor de staleLockTime() es utilizado por lock() y tryLock() para determinar cuándo un fichero de bloqueo existente se considera obsoleto, es decir, dejado por un proceso bloqueado. Esto es útil para el caso en que el PID se reutilizó mientras tanto, por lo que una forma de detectar un archivo de bloqueo rancio es por el hecho de que ha existido durante mucho tiempo.
Esta función fue introducida en Qt 6.2.
Véase también staleLockTime().
int QLockFile::staleLockTime() const
Devuelve el tiempo en milisegundos tras el cual un archivo de bloqueo se considera obsoleto.
Véase también setStaleLockTime().
[since 6.2] std::chrono::milliseconds QLockFile::staleLockTimeAsDuration() const
Devuelve un objeto std::chrono::milliseconds que denota el tiempo tras el cual un archivo de bloqueo se considera obsoleto.
Esta función se introdujo en Qt 6.2.
Véase también setStaleLockTime().
bool QLockFile::tryLock(int timeout)
Intenta crear el archivo de bloqueo. Esta función devuelve true si se ha obtenido el bloqueo; en caso contrario, devuelve false. Si otro proceso (u otro hilo) ya ha creado el fichero de bloqueo, esta función esperará como máximo timeout milisegundos a que el fichero de bloqueo esté disponible.
Nota: Pasar un número negativo como timeout es equivalente a llamar a lock(), es decir, esta función esperará eternamente hasta que el fichero de bloqueo pueda ser bloqueado si timeout es negativo.
Si el bloqueo fue obtenido, debe ser liberado con unlock() antes de que otro proceso (o hilo) pueda bloquearlo con éxito.
No está permitido llamar a esta función varias veces sobre el mismo bloqueo desde el mismo hilo sin desbloquear primero, esta función siempre devolverá false cuando se intente bloquear el fichero recursivamente.
Véase también lock() y unlock().
[since 6.2] bool QLockFile::tryLock(std::chrono::milliseconds timeout = std::chrono::milliseconds::zero())
Intenta crear el archivo de bloqueo. Esta función devuelve true si se ha obtenido el bloqueo; en caso contrario, devuelve false. Si otro proceso (u otro hilo) ya ha creado el fichero de bloqueo, esta función esperará como máximo timeout a que el fichero de bloqueo esté disponible.
Si se obtuvo el bloqueo, debe liberarse con unlock() antes de que otro proceso (o hilo) pueda bloquearlo con éxito.
No se permite llamar a esta función múltiples veces sobre el mismo bloqueo desde el mismo hilo sin desbloquear primero, esta función siempre devolverá false cuando se intente bloquear el fichero recursivamente.
Esta es una función sobrecargada.
Esta función se introdujo en Qt 6.2.
Véase también lock() y unlock().
void QLockFile::unlock()
Libera el bloqueo, borrando el archivo bloqueado.
Llamar a unlock() sin bloquear primero el fichero, no hace nada.
© 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.