QLockFile Class
QLockFileクラスは、ファイルを使ったプロセス間のロックを提供します。詳細...
ヘッダー | #include <QLockFile> |
CMake: | find_package(Qt6 REQUIRED COMPONENTS Core) target_link_libraries(mytarget PRIVATE Qt6::Core) |
qmake: | QT += core |
- 継承されたメンバーを含む全メンバーのリスト
- QLockFileは、Input/OutputおよびNetworkingに属しています。
パブリック・タイプ
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は2つのユースケースをサポートしています。1つは短期間の操作でリソースを保護する場合(新しい設定を保存する前に設定ファイルが変更されたかどうかを確認する場合など)、もう1つは長期間にわたってリソース(ユーザーがエディターで開いたドキュメントなど)を保護する場合です。
短期間の操作で保護する場合は、lock() を呼び出し、実行中の操作が終了するまで待つことができます。しかし、長時間にわたってリソースを保護する場合、リソースがロックされていることをユーザーに警告するために、アプリケーションは常にsetStaleLockTime (0ms)を呼び出し、次に短いタイムアウトでtryLock ()を呼び出す必要があります。
ロックを保持しているプロセスがクラッシュした場合、ロック・ファイルはディスク上に残り、他のプロセスが共有リソースにアクセスするのを防ぐことができます。このため、QLockFile はファイルに書き込まれたプロセス ID に基づいて、このような「古い」ロック・ファイルの検出を試みます。その間にプロセス ID が再利用された場合に備えて、現在のプロセス名とロック・ファイルのプロセス ID に対応するプロセス名を比較します。プロセス名が異なる場合、ロックファイルは古いとみなされる。さらに、ロック・ファイルの最終更新時間(デフォルトでは 30 秒、短時間のオペレーションを想定)が考慮されます。ロックファイルが古いと判断された場合、削除されます。
getLockInfoリソースを長期間にわたって保護するような使用例では、setStaleLockTime(0) をコールし、tryLock() がLockFailedError を返したときに、ドキュメントがロックされていることをユーザーに通知します。
注意: Windowsでは、マシンのホスト名にUS-ASCII文字セット以外の文字が含まれている場合、このクラスは古くなったロックの検出に問題があります。
メンバ型ドキュメント
enum 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 を返す場合、この関数を呼び出すと、既存のロック・ファイルに関する詳細情報を調べることができる:
- アプリケーションの PID(pid で返される)
- アプリケーションの PID(hostname )で返される)。 (ネットワーク・ファイルシステムの場合に便利)、
- 作成したアプリケーションの名前(appname )、
tryLock() は、この PID を持つ実行中のアプリケーションがない場合、自動的にファイルを削除するので、LockFailedError は、この PID を持つアプリケーションがある場合にのみ発生することに注意してください(関係ない場合もありますが)。
これは、既存のロック・ファイルについてユーザーに通知し、削除する選択肢を与えるために使用できます。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 秒以上ファイルをロックし続ける場合 (たとえば、メガバイトのデータを 2 分間保存する場合など)、 setStaleLockTime() を使用してより大きな値を設定する必要があります。
staleLockTime の値は、lock() とtryLock() で使用され、既存のロック・ファイルがいつ古くなったか、つまりクラッシュしたプロセスによって残されたものかを判断するために使用される。これは、PIDが再利用された場合に便利であり、古くなったロック・ファイルを検出する1つの方法は、それが長い間存在しているという事実である。
これはオーバーロードされた関数であり、呼び出しと同等である:
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 が再利用された場合に便利で、古くなったロックファイルを検出する 1 つの方法は、そのロックファイルが長い間存在しているという事実です。
この関数は 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() でロックを解放する必要がある。
同じスレッドから同じロックに対して、最初にロックを解除せずにこの関数を複数回呼び出すことは許されない。
[since 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() を呼び出しても、何もしない。
© 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.