2010-03-09 2 views
2

나는 하나의 xml 파일을 가지고 있으며, 프로그램의 모든 새로운 스레드 (BHO)는 동일한 Tinyxml 파일을 사용하고 있습니다. 다음을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 라이브러리에서 파일을 언로드하는 기능을합니다.

문제에 대한 도움이나 더 나은 이해가 좋을 것입니다. 감사합니다. . 댓글 (스크랩 이전의 대답)를 기반으로

답변

2

업데이트 :

OK, 나는 어떻게 다른 스레드에 제한없이 문서를 열고 우리에게 알려주는 TinyXml 문서에서 많은 것을 보지 않았다.

이 경우해야 할 일은 TiXmlDocument에 하나의 인스턴스 만 선언하고 스레드간에 공유하는 것입니다. 쓰레드가 파일에 쓸 때마다 임계 영역에 들어가고, 쓸 내용을 쓰고, 파일을 저장 한 다음, 중요한 섹션을 종료합니다.

다른 해결 방법이 표시되지 않습니다. 코멘트를

업데이트 :
당신이 MFC를 사용하고 있기 때문에 귀하의 코드는 다음과 같이 보일 것 스레드 : 지금 시간에 C++를 작성하지 않은

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 
    } 
} 

을하지만, 대략 무엇을해야 너 찾고있어. 종소리와 호각은 추가 비용이 듭니다. :)

+0

제 질문은 어떻게 정리합니까? 정확히 내가 뭘 정리해야합니까? – shaimagz

+0

이 경우 더 좋은 방법은 스레드간에 XML 문서를 공유하고 각 스레드에서 배치 작업을 보내는 것입니다. 배치 작업은 xml 파일에 기록되고 잠금/임계 영역 아래에 저장됩니다. – Kiril

+0

스레드간에 개체를 공유하는 것은 아직 내 프로그래밍 수준에 없지만 시도해 보겠습니다. 감사. – shaimagz

관련 문제