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は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::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 で返される)
  • アプリケーションの 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 を返す。

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が再利用された場合に便利であり、古くなったロック・ファイルを検出する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

これはオーバーロードされた関数です。

ロックファイルが古いとみなされる時間をミリ秒単位で返します。

この関数は Qt 6.2 で導入されました。

setStaleLockTime()も参照してください

bool QLockFile::tryLock(int timeout)

ロックファイルの作成を試みます。この関数は、ロックが得られた場合はtrue を返し、そうでない場合はfalse を返します。他のプロセス(または他のスレッド)が既にロック・ファイルを作成している場合、この関数はロック・ファイルが利用可能になるまで最大timeout ミリ秒待ちます。

注意:timeout に負の数を渡すと、lock() を呼び出すのと同じことになる。つまり、timeout が負の場合、この関数はロック・ファイルがロックできるまで永遠に待つことになる。

ロックが取得された場合、他のプロセス(またはスレッド)がロックに成功する前に、unlock() でロックを解放する必要がある。

同じスレッドから同じロックに対して、最初にロックを解除せずにこの関数を複数回呼び出すことは許されない。

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() も参照して ください。

©2024 The Qt Company Ltd. 本文書に含まれる文書の著作権は、それぞれの所有者に帰属します。 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。