c ++ 11多线程,从其他线程调用时,成员函数无法正常工作

时间:2013-07-04 16:18:02

标签: c++ multithreading c++11 mutex sfml

我创建了一个名为Chat的类,它应该在屏幕上存储和显示聊天消息。在我的程序中,我创建了一个接收字符串的线程。当该线程收到一个字符串时,应该在成员函数的帮助下将该字符串添加到聊天中。但是当接收线程尝试添加字符串时,似乎丢失了部分甚至完整字符串。当从主线程调用时,成员函数按预期工作,并且接收到的字符串在接收线程内部没有损坏,因此我认为问题必须与线程相关。我正在使用互斥锁来确保聊天对象一次只能由一个线程使用。在主函数中初始化接收线程时,我将指针传递给Chat对象。

代码:

`

class Chat {
private:
    const static int MAX_LINES = 25;
    int linewidth;
    sf::IntRect size;
    sf::Font font;
    sf::Text tempText;
    std::deque<sf::Text> chatlog;
public:
    Chat();
    void add_string( std::string s );
    void render();
};

// inside the receiving thread...

while( !quit ) {
    sf::Packet packet;
    std::string receivedString;

    if ( socket.receive( packet, sender, port ) != sf::Socket::Done ) {
        // error...
    }

    packet >> receivedString;
    chatMutex.lock();
    p->add_string( receivedString );
    chatMutex.unlock(); 
}
void Chat::add_string( std::string s ) {
    // Move all other strings one line up.
    for( auto it = chatlog.begin(); it < chatlog.end(); it++ ) {
        sf::Vector2f temp = it->getPosition();
        temp.y -= linewidth;
        it->setPosition( temp );
    }
    // Add the new string to the bottom of the chat.
    tempText.setString( s );
    int xPos = size.left;
    int yPos = size.top + size.height - linewidth;
    tempText.setPosition( sf::Vector2f( xPos, yPos ) );
    chatlog.push_back( tempText );

    if( chatlog.size() > MAX_LINES ) {
        chatlog.pop_front();
    }   
}

`

0 个答案:

没有答案