2

単一の xml ファイルがあり、プログラム (BHO) のすべての新しいスレッドが同じ Tinyxml ファイルを使用しています。

プログラムで新しいウィンドウが開くたびに、次のコードが実行されます。

const char * xmlFileName = "C:\\browsarityXml.xml";
TiXmlDocument doc(xmlFileName);
doc.LoadFile();
//some new lines in the xml.. and than save:
doc.SaveFile(xmlFileName);

問題は、最初のウィンドウが新しいデータを xml に追加して保存した後、次のウィンドウが追加できないことです。次のものは xml のデータを読み取ることはできますが、書き込むことはできません。

機能させるために2つの可能性について考えましたが、それらを実装する方法がわかりません:

  1. 完了したら、doc オブジェクトを破棄します。
  2. ファイルをアンロードするための Tinyxml ライブラリの関数。

問題の助けや理解を深めることは素晴らしいことです。ありがとう。

4

1 に答える 1

2

コメントに基づいて更新します(以前の回答を破棄します):

OK、TinyXml のドキュメントには、他のスレッドに制限されずにドキュメントを開く方法を説明するものはあまりありませんでした。

この場合にすべきことは、インスタンスを 1 つだけ宣言し、TiXmlDocumentそれをスレッド間で共有することです。スレッドがファイルに書き込むときはいつでも、クリティカル セクションに入り、書き込む必要があるものを書き込み、ファイルを保存してから、クリティカル セクションを終了します。

別の回避策はありません。

コメントごとに更新:
MFC スレッドを使用しているため、コードは次のようになります。

class SafeTinyXmlDocWrapper
{
private:
    static bool m_isAlive = FALSE;
    static CCriticalSection m_criticalSection;
    char* m_xmlFileName;
    TiXmlDocument m_doc;

public:

    SafeTinyXmlDocWrapper()
    {
        m_xmlFileName = "C:\\browsarityXml.xml";
        m_doc = TiXmlDocument(m_xmlFileName);
        m_doc.LoadFile();
        m_isAlive = TRUE;
    }

    ~SafeTinyXmlDocWrapper()
    {
        CSingleLock lock(&m_criticalSection);
        lock.Lock(); // only one thread can lock

        m_isAlive = FALSE;

        // cleanup and dispose of the document

        lock.Unlock();
    }

    void WriteBatch(BatchJob& job)
    {
        CSingleLock lock(&m_criticalSection);
        lock.Lock(); // only one thread can lock
        if(m_isAlive) // extra protection in case the destructor was called
        {
            // write the batch job to the xml document

            // save the xml document
            m_doc.SaveFile(m_xmlFileName);
        }
        lock.Unlock(); // the thread unlocks once it's done
    }
}

私はしばらくの間 C++ を書いていませんが、おおむねあなたが探しているものであるはずです。ベルとホイッスルは追加料金がかかります:)。

于 2010-03-09T01:34:34.023 に答える