ошибки std :: stringstream? - PullRequest
       21

ошибки std :: stringstream?

1 голос
/ 27 июля 2010

У меня есть собственная библиотека DLL, которая внедряется в другой процесс. Из другого процесса DLL отправляет сообщения IPC через boost :: message_queue в мое приложение. Я использую std :: stringstream для создания сообщений, как показано ниже:

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

В DLL одна из функций постоянно отправляет следующее сообщение:

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

SendMessage();

Теперь выдается сообщение типа CLIENT_TABLE_PLAYER_BANKROLL|00211606|6|€1.28|. Проблема в том, что в каждых нескольких тысячах сообщений первый параметр там не добавляется, и сообщение становится как 00211606|6|€1.28|

Почему это? Это какая-то ошибка в std :: stringstream или я что-то не так делаю?

Заранее спасибо за любую помощь.

EDIT:

Проблема решена. Это была проблема безопасности потоков. Простой мьютекс решил это.

1 Ответ

11 голосов
/ 27 июля 2010

Ваш код не выполняется при попытке отправить самое длинное сообщение. Поэтому я предполагаю, что цель сообщения не читается достаточно быстро.

Я думаю, что ваша концепция попытки 5 раз ошибочна, потому что вы глотаете свое сообщение, если оно не было отправлено - и вы даже не обрабатываете эту серьезную ошибку. Лично я рекомендую либо ждать вечно, чтобы отправить ваше сообщение, либо создать локальный буфер нормального размера, с которым вы работаете - и если этот буфер заполнен, то вы ждете вечно.

Я также рекомендую не есть все исключения, не заботясь о них. Вы молча скрываете серьезные ошибки.

В качестве примечания: Люди часто думают, что в std :: string есть ошибки, или в ОС есть ошибки, или даже в том, что в компиляторе есть ошибки. Позвольте мне заверить вас, что эти люди так часто ошибаются в своих обвинениях, что даже самый защитный пессимист скажет, что они всегда неправы. И те, кто прав, могут доказать это в тривиальных программах.

Пожалуйста, извините за мое высокомерие.

...