2010-03-09 2 views
2

У меня есть один xml-файл, и каждый новый поток программы (BHO) использует тот же файл Tinyxml.Tinyxml Multi Task

каждый раз, когда новое окно открывается в программе, он запускает этот код:

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 для выгрузки файла.

Любая помощь или лучшее понимание проблемы будет замечательным. Спасибо.

ответ

2

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

ОК, я не видел много в документации TinyXML, что говорит нам о том, как открыть документ без ограничений для других потоков.

Что вы должны сделать в этом случае, объявите только один экземпляр для TiXmlDocument и разделите его между потоками. Всякий раз, когда поток записывает в файл, он переходит в критический раздел, записывает то, что ему нужно написать, сохранить файл, а затем выйти из критического раздела.

Я не вижу другого обходного пути.

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

+0

мой вопрос был, как очистить? и что именно я должен убрать? – shaimagz

+0

Я думаю, что в этом случае лучше всего разделить XML-документ между потоками и отправить его пакетные задания из каждого потока. Пакетное задание будет записано в xml-файл и сохранено в разделе блокировки/критики. – Kiril

+0

Совместное использование объектов между потоками еще не на моем уровне программирования, но я попробую. Благодарю. – shaimagz