5

Delphi で記述されたコマンド ライン ツールがあります。このツールは、XML ファイルにノードを挿入してすぐに終了します。ツールの複数のインスタンスを同時に実行し、同じ XML にノードを挿入できるようにする必要があります。

この目的を達成するために、単純なファイル「ミューテックス」を導入しました。このツールは、XML に書き込む前に 1 つの一時ファイルを作成し、書き終わったら一時ファイルを削除します。そのため、別のインスタンスが実行されると、この一時ファイルの存在がチェックされ、削除されるまで待機します。次に、一時ファイルを再度作成し、XML に書き込み、一時ファイルを削除します。

問題は、これが正常に機能するのは、2 ~ 3 個のインスタンスが同時に XML ファイルに書き込もうとした場合だけです。さらにインスタンスがある場合、それらのいくつかは永久に待機し、ノードを XML に追加することはありません。

多数のインスタンスを同時に実行して XML に書き込んで動作させるためのより良い方法はありますか?

4

5 に答える 5

6

名前付きセマフォまたはミューテックスは、単一のマシンでこれを実行できます。SyncObjsのTMutexなどを使用し、name引数を取るコンストラクターの1つを使用します。すべてのアプリケーションで同じ名前を使用すると、それらは同じカーネルミューテックスを介して同期されます。アクセスするにはTMutex.Acquireを使用し、完了したらTMutex.Releaseを使用して、try/finallyブロックで保護します。

InitialOwner引数を持つTMutex.Createオーバーロードを使用しますが、これにはFalseを指定します(もちろん、ミューテックスをすぐに取得する場合を除きます)。このオーバーロードは、舞台裏でCreateMutexを呼び出します。詳細については、 SyncObjsのソースとCreateMutexのドキュメントを参照してください。

于 2008-09-19T14:28:23.050 に答える
4

1-保留中の変更を記録するファイルを設定します(キューのように機能します)

2-そのファイルを監視する簡単なアプリを作成し、変更をXMLファイルに適用します

3-現在のコマンドラインツールを変更して、変更要求を「保留中の変更」ファイルに追加します

これで、1つのアプリだけが最終的なXMLファイルに触れる必要があります。

于 2008-09-19T12:19:09.163 に答える
2

TXMLDocumentは、複数のインスタンスが同じファイルに同時に書き込むことをすでに防止しています。ですから、あなたの質問が本当に意味するのは、「XMLドキュメントを開いて読み取り、他のインスタンスがドキュメントを読み取っている間に他のインスタンスがドキュメントに書き込むのを防ぎ、他のインスタンスが同じことをしますか?」

この場合、TXMLDocumentにファイルのオープンとクローズを許可するのではなく、自分でファイルのオープンとクローズを処理する必要があります。TFileStreamを使用して、LoadFromFileの代わりに排他的な読み取りおよび書き込みロックとXMLDocument.LoadFromStreamを使用してファイルを開きます。stream.Positionを0にリセットした後、SaveToStreamを使用してドキュメントを保存します。終了時にストリームを確実に閉じるには、try/finallyを使用します。ファイルを排他的にロックしているので、一時ファイルやその他の種類のミューテックスはもう必要ありません。

明らかに、別のインスタンスが現在ファイルの読み取り/書き込みを行っている場合、ファイルを開くことが失敗する可能性があります。したがって、これを処理して後で再試行する必要があります。

于 2008-09-19T12:24:34.813 に答える
1

ノードを追加する必要があるたびに、ドキュメント全体をリロードして再解析する必要があることを覚えておいてください。XMLドキュメントのサイズと保存するデータによっては、データを転送する最も効率的な方法ではない場合があります。

別のファイルに書き込むアプローチは興味深いソリューションです。考慮すべき1つの方法は、「複数のインスタンス」アプリに一意のXMLファイルを書き込んでから、FindFirstループを使用して別のプログラムでそれらをマスタードキュメントにロードすることです。そうすれば、既存のプログラムに大きな変更を加えることなく、xml構造をほとんどそのまま維持できます。

于 2008-09-19T14:18:08.630 に答える