gpt4 book ai didi

c++ - Tinyxml 多任务

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:00:54 24 4
gpt4 key购买 nike

我有一个 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 库中的一些函数来卸载文件。

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

最佳答案

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

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

关于c++ - Tinyxml 多任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2406057/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com