Tinyxml Multi Task - PullRequest
       9

Tinyxml Multi Task

2 голосов
/ 09 марта 2010

У меня есть один 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. Уничтожьте объект документа, когда я закончу с ним.
  2. Некоторая функция в библиотеке Tinyxml для выгрузки файла.

Любая помощь или лучшее понимание проблемы будут великолепны. Благодаря.

1 Ответ

2 голосов
/ 09 марта 2010

Обновление на основе комментариев (записка предыдущего ответа):

ОК, я не видел много в документации 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 ++, но это должно быть примерно то, что вы ищете. Колокола и свистки стоят дополнительно:).

...