我创建了一个名为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();
}
}
`