2010-07-27 5 views
1

다른 프로세스에 주입되는 자체 DLL이 있습니다. 다른 프로세스에서 DLL은 내 응용 프로그램에 boost::message_queue을 통해 IPC 메시지를 보냅니다. 나는 다음과 같은 메시지를 구성하는 표준 : : 이제 stringstream을 사용하고 있습니다 :std :: stringstream 버그?

AddMessageParameter("CLIENT__TABLE__PLAYER_BANKROLL"); 
AddMessageParameter(window_handle); 
AddMessageParameter(seat); 
AddMessageParameter(s); 

SendMessage(); 

이제이 같은 메시지를 생성 다음 DLL에서

class Client 
{ 
    ... 

    private: 
     template <class T> void AddMessageParameter(const T &m) 
     { 
      _message &lt&lt m &lt&lt "|"; 
     } 

     void SendMessage() 
     { 
      if (_mq && _message.str().length() < 1024) { 
       // Do not send the same message again. 

       if (_mq_last_sent_message != _message.str()) { 
        _mq_last_sent_message = _message.str(); 

        try { 
         unsigned int tries = 0; 

         // Try send the message five times before giving up. 

         do { 
          if (_mq->try_send(_mq_last_sent_message.c_str(), _mq_last_sent_message.length(), 0)) 
           tries = 5; 
          else 
           ::Sleep(128); 

          ++tries; 
         } while (tries < 5); 
        } catch (...) { 
         // TODO: Add log4cxx logging here for errors... 
        } 
       } 
      } 

      // Clear the message for a new one. 

      _message.seekp(0); 
      _message.clear(); 
      _message.str(std::string()); 
     } 

    private: 
     std::stringstream _message; 
     std::string _mq_last_sent_message; 
     boost::shared_ptr<boost::interprocess::message_queue> _mq; 
}; 

, 기능 중 하나는 지속적으로 다음과 같은 메시지 전송 CLIENT_TABLE_PLAYER_BANKROLL|00211606|6|€1.28|. 문제는 몇 천 개의 메시지마다 첫 번째 매개 변수가 추가되지 않고 메시지가 다음과 같이 표시된다는 것입니다. 00211606|6|€1.28|

왜 그런가요? 이 버그가 std :: stringstream에 있습니까? 아니면 제가 아마 뭔가 잘못하고 있습니까?

미리 도움을 청하십시오.

편집 :

문제가 해결되었습니다. 이것은 스레드 안전성의 문제였습니다. 간단한 뮤텍스가이를 해결했습니다.

답변

11

가장 긴 메시지를 보내려고하면 코드가 실패합니다. 따라서 메시지 대상이 충분히 빨리 읽지 않는다고 가정합니다.

메시지가 전송되지 않으면 메시지를 삼키기 때문에 5 번 시도라는 개념에 결함이 있다고 생각합니다.이 심각한 오류의 경우조차 처리하지 않습니다. 개인적으로 메시지를 보내기 위해 영원히 기다리거나 작업 할 정상적인 크기의 로컬 버퍼를 빌드하는 것이 좋습니다.이 버퍼가 가득 차면 영원히 기다립니다.

또한 모든 예외를 돌보지 않고 섭취하지 않는 것이 좋습니다. 심각한 오류는 숨기시겠습니까?

사이드 노트로 : 사람들은 종종 std :: string에 버그가 있거나 OS에 버그가 있거나 심지어 컴파일러에 버그가 있다고 생각합니다. 나는이 사람들이 종종 가장 비관적 인 비관론자 일지라도 이 항상이라고 잘못 말할 수 있다는 비난에 종종 잘못되었다는 것을 알려드립니다. 그리고 올바른 사람은 사소한 프로그램에서 그것을 증명할 수 있습니다.

제 오만함을 용서하십시오.

+5

+1 사이드 노트 – onof

+1

사이드 노트 용 +1. –

관련 문제