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中的数据,但无法写入。

我考虑了两种使它起作用的可能性,但我不知道如何实现它们:

  1. 完成后销毁 doc 对象。
  2. Tinyxml 库中的一些函数来卸载文件。

对问题的任何帮助或更好的理解都会很棒。谢谢。

4

1 回答 1

2

根据评论更新(废弃以前的答案):

好的,我在 TinyXml 文档中没有看到太多内容,它告诉我们如何在不受其他线程限制的情况下打开文档。

在这种情况下,您应该做的是仅向 声明一个实例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 回答