std :: stringstream错误?

nha*_*123 1 c++ string dll ipc

我有自己的DLL被注入另一个进程.从另一个进程,DLL通过boost :: message_queue将IPC消息发送到我的应用程序.我正在使用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;
};
Run Code Online (Sandbox Code Playgroud)

在DLL中,其中一个函数不断发送以下消息:

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

SendMessage();
Run Code Online (Sandbox Code Playgroud)

现在这会产生一条消息CLIENT_TABLE_PLAYER_BANKROLL|00211606|6|€1.28|.问题是,在每几千条消息中,第一个参数都没有添加,消息就像00211606|6|€1.28|

这是为什么?这是std :: stringstream中的一些错误,还是我做错了?

在此先感谢您的帮助.

编辑:

问题解决了.这是一个线程安全问题.一个简单的互斥体解决了这个问题.

nus*_*usi 11

尝试发送最长消息时,您的代码失败.因此,我假设消息目标读取速度不够快.

我认为你尝试5次的概念是有缺陷的,因为如果它没有被发送你吞下你的消息 - 你甚至没有处理这个严重的错误案例.我个人建议要么永远等待发送你的消息,要么建立一个你工作的理智大小的本地缓冲区 - 如果这个缓冲区已满,那么你会永远等待.

我还建议你不要在没有照顾他们的情况下吃掉所有例外.你默默地隐藏了严重的错误.

作为旁注:人们通常认为std :: string有bug,或者操作系统有bug,甚至编译器都有bug.让我向你们保证,这些人在他们的指责中经常是错误的,即使是最防守的悲观主义者也会说他们总是错的.那些正确的人可以在琐碎的程序中证明这一点.

请原谅我的傲慢.