1

)

経由でアクセスする SQLite データベースを使用してプログラムを開発していますQSqlDatabase。プログラムの実行中にデータベースに何らかの変更が加えられた場合 (まれであることを願っています) を処理したいと思います (たとえば、ユーザーが書き込みアクセスを削除したり、ファイルを移動または削除したり、手動で変更したりする可能性があります)。

を使ってみましたQFileSystemWatcher。データベースファイルを監視させ、何かを書き込むすべての関数で、シグナルをブロックして、「外部」の変更のみが変更されたシグナルをトリガーするようにしました。

問題は、QFileSystemWatcherおよび/または のディスクへの実際の書き込みのチェックが、QSqlDatabase::commit()私が呼び出した正確な瞬間に発生しないように見えることですcommit()。そのため、実際には、最初にQFileSystemWatcherの信号がブロックされ、次にいくつかのものを変更し、次にそれらのブロックを解除して、次に、変更するファイルを報告します。

次に、関数が変更を要求するたびに bool 変数 ( m_writeInProgress)を設定しようとしました。true次に、「変更された」スロットは、書き込みアクションが要求されているかどうかを確認し、要求されている場合は、再度に設定m_writeInProgressして終了します。falseこのようにして、「外部」の変更のみを処理します。

問題は、実際の書き込みが行われている正確な瞬間に変更が発生した場合、それがキャッチされないことです。

おそらく、QFileSystemWatcherこれを実装するために a を使用するのは間違った方法です。

これを安全な方法で行うにはどうすればよいでしょうか。

助けてくれてありがとう!

編集:

問題の一部を解決する方法を見つけました。データベース ファイルの排他ロックを開始すると、他の接続による変更が防止されます。それは非常に簡単です、私はただ実行する必要があります

PRAGMA locking_mode = EXCLUSIVE
BEGIN EXCLUSIVE
COMMIT

私のプログラムの別のインスタンスがデータベースにアクセスしようとした場合に発生するエラーを処理します。

残っているのは、実行時にユーザーが(誤って)ファイルを削除したかどうかを知ることです...

4

1 に答える 1