我只有一个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中的数据,但无法对其进行写入。

我考虑了使它起作用的两种可能性,但我不知道如何实现它们:
  • 完成操作后销毁doc对象。
  • Tinyxml库中的某些函数可用于卸载文件。

  • 对问题的任何帮助或更好的理解将是非常好的。
    谢谢。

    最佳答案

    根据评论更新(取消先前的答案):

    好的,我在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++了,但是它应该大致上就是您想要的。钟声和口哨声额外收费:)。

    10-07 18:53