The QLockFile 類使用文件在進程之間提供鎖。 更多...
| 頭: | #include <QLockFile> |
| qmake: | QT += core |
| Since: | Qt 5.1 |
| enum | LockError { NoError, LockFailedError, PermissionError, UnknownError } |
| QLockFile (const QString & fileName ) | |
| ~QLockFile () | |
| QLockFile::LockError | error () const |
| bool | getLockInfo (qint64 * pid , QString * hostname , QString * appname ) const |
| bool | isLocked () const |
| bool | lock () |
| bool | removeStaleLockFile () |
| void | setStaleLockTime (int staleLockTime ) |
| int | staleLockTime () const |
| bool | tryLock (int timeout = 0) |
| void | unlock () |
| QScopedPointer<QLockFilePrivate> | d_ptr |
The QLockFile 類使用文件在進程之間提供鎖。
鎖定文件可以用於阻止多個進程並發性訪問同一資源。例如,在磁盤上的配置文件或套接字、端口、共享內存區域 ...
序列化纔有保證,若訪問共享資源的所有進程使用 QLockFile ,采用相同文件路徑。
QLockFile 支持 2 用例:為短期操作保護資源 (如,驗證配置文件是否已改變在保存新設置之前),和瞭解無限長期存活保護資源 (如,用戶在編輯器中打開文檔)。
當保護短期操作時,可以調用 lock () 並等待直到任何在運行操作完成。當長時間保護資源時,不管怎樣,應用程序應該始終調用 setStaleLockTime (0) 然後 tryLock () 采用短超時,以警告用戶資源被鎖定。
若持有鎖的進程崩潰,鎖定文件停留在磁盤且可以阻止任何其它進程訪問共享資源。由於此原因, QLockFile 會試著基於寫入文件的進程 ID 檢測這種 "陳舊" 鎖文件。為控製進程 ID 同時被重用的狀況,會比較當前進程名稱與對應鎖文件進程 ID 的進程名稱。若進程名稱不同,認為鎖文件陳舊。此外,會考慮鎖文件的最後修改時間 (默認 30 秒,對於短期存活操作用例)。若發現鎖文件陳舊,會刪除它。
因此,對於長時間保護資源的用例,應該調用 setStaleLockTime (0),和當 tryLock () 返迴 LockFailedError ,通報用戶文檔被鎖定,可能使用 getLockInfo () 瞭解更多細節。
注意: 在 Windows,此類檢測陳舊鎖時會遇到問題,若機器主機名包含 US-ASCII 字符集外的字符。
此枚舉描述最後結果為調用 lock () 或 tryLock ().
| 常量 | 值 | 描述 |
|---|---|---|
QLockFile::NoError
|
0
|
成功獲取鎖。 |
QLockFile::LockFailedError
|
1
|
無法獲取鎖由於被另一進程持有。 |
QLockFile::PermissionError
|
2
|
無法創建鎖定文件由於父級目錄缺乏權限。 |
QLockFile::UnknownError
|
3
|
發生其它錯誤,例如:完整分區阻止寫齣鎖定文件。 |
構造新鎖定文件對象。對象被創建在解鎖狀態下。當調用 lock () 或 tryLock (),鎖定文件 fileName 將被創建,若它尚不存在。
銷毀鎖定文件對象。若獲得鎖,這將釋放鎖通過刪除鎖定文件。
返迴鎖定文件錯誤狀態。
若
tryLock
() 返迴
false
,此函數可以被調用以找齣鎖定失敗的原因。
檢索鎖定文件當前所有者的有關信息。
若
tryLock
() 返迴
false
,和
error
() 返迴
LockFailedError
,此函數可以被調用以找齣有關現有鎖定文件的更多信息:
注意, tryLock () 會自動刪除文件,若沒有采用此 PID (進程標識) 在運行的應用程序,因此 LockFailedError 纔會發生,若有采用此 PID (進程標識) 的應用程序 (盡管可能無關)。
This can be used to inform users about the existing lock file and give them the choice to delete it. After removing the file using removeStaleLockFile (),應用程序可以調用 tryLock () 再次。
此函數返迴
true
if the information could be successfully retrieved, false if the lock file doesn't exist or doesn't contain the expected data. This can happen if the lock file was deleted between the time where
tryLock
() failed and the call to this function. Simply call
tryLock
() again if this happens.
返迴
true
若獲得鎖通過此
QLockFile
實例,否則返迴
false
.
另請參閱 lock (), unlock (),和 tryLock ().
創建鎖定文件。
若另一進程 (或另一綫程) 已經創建鎖定文件,此函數將阻塞直到進程 (或綫程) 釋放它為止。
不允許在未先解鎖的情況下從同一綫程同一鎖上多次調用此函數。此函數將 dead-lock 當遞歸鎖定文件時。
返迴
true
若獲得鎖,false 若由於不可恢復的錯誤 (如:父目錄沒有權限) 而無法獲得鎖。
試圖強行移除現有鎖定文件。
不推薦調用此當保護短期活著操作時: QLockFile 已負責移除鎖定文件,當它們早於 staleLockTime ().
此方法纔應該被調用當保護長時間資源時,即:采用 staleLockTime (0),和之後 tryLock () 返迴 LockFailedError ,且用戶同意移除鎖定文件。
返迴
true
當成功時,false 若鎖定文件無法被移除。這發生在 Windows,當擁有鎖的應用程序仍在運行時。
集 staleLockTime to be the time in milliseconds after which a lock file is considered stale. The default value is 30000, i.e. 30 seconds. If your application typically keeps the file locked for more than 30 seconds (for instance while saving megabytes of data for 2 minutes), you should set a bigger value using setStaleLockTime().
值 staleLockTime 用於 lock () 和 tryLock () in order to determine when an existing lock file is considered stale, i.e. left over by a crashed process. This is useful for the case where the PID got reused meanwhile, so one way to detect a stale lock file is by the fact that it has been around for a long time.
另請參閱 staleLockTime ().
返迴時間 (以毫秒為單位),在此時間之後鎖定文件被認為陳舊。
另請參閱 setStaleLockTime ().
試圖創建鎖定文件。此函數返迴
true
若獲得鎖;否則返迴
false
。若另一進程 (或另一綫程) 已經創建鎖文件,此函數將等待最多
timeout
毫秒為使鎖文件變為可用。
注意:傳遞負數作為 timeout 相當於調用 lock (),即:此函數將永遠等待,直到鎖文件可以被鎖定若 timeout 為負。
若有獲得,必須釋放鎖采用 unlock () 在另一進程 (或綫程) 可以成功鎖定它之前。
在不首先解鎖的情況下,對來自同一綫程的相同鎖多次調用此函數是不允許的。此函數將 always 返迴 false 當試圖遞歸鎖定文件時。
釋放鎖,通過刪除鎖定文件。
調用 unlock() 在首先未鎖定文件的情況下,什麼都不做。