我只有一个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中的数据,但无法对其进行写入。
我考虑了使它起作用的两种可能性,但我不知道如何实现它们:
对问题的任何帮助或更好的理解将是非常好的。
谢谢。
最佳答案
根据评论更新(取消先前的答案):
好的,我在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++了,但是它应该大致上就是您想要的。钟声和口哨声额外收费:)。