在 class 的两个对象之间使用队列
Using queue Between two object of class
为了在class的两个对象之间发送消息!
我实现了这个
class User
{
public:
virtual void run()
{
while (true)
{
string receivedMessage = receiveMessage();
sendMessage(receivedMessage);
}
}
virtual void sendMessage(string message)
{
sentQueue.push(reply);
};
virtual string receiveMessage()
{
string receivedMessage;
receivedMessage = receivedQueue.pop();
return receivedMessage;
};
private:
};
我现在要问的是在哪里实例化这个阻塞队列以在两个对象(用户 1 和用户 2)之间使用它,以便在它们之间交换消息
您有一个全局发送队列和一个全局接收队列。您需要的是每个玩家一个接收队列。
在播放器 class 上有一个发送方法可以写入他们的发送队列
所以玩家 1 会去
player2.Send("hello player2");
怎么做
class Player
{
BlockingQueue<string> queue_ = BlockingQueue<string>();
public:
void Post(const string& message){
queue_.push(message);
}
virtual void run()
{
while (true)
{
string msg= queue_.pop();
// do something with the message
if(msg == "BangBang")
{
}
}
}
现在你可以走了
Player player1("player1");
Player player2("player2");
thread thread1(&Player::run, player1);
thread thread2(&Player::run, player2);
player1.Post("BangBang");
也许你应该让你的信息更多的是一个字符串,比如
class Message{
Player* sender;
string text;
CommandType ct;
}
或具有类似 "player1/shoot/0,5"
的字符串语法
你需要知道消息来自谁,这样你才能做出正确的反应并可能回复
或者 post 方法在发送播放器对象上调用并包含目标用户。使用我建议的消息 class
class Player
{
BlockingQueue<Message> queue_ = BlockingQueue<Message>();
public:
void Post(const string& message, Player *dest){
Message msg;
msg.sender= this; // sender
msg.text = message;
dest->queue_.push(message);
}
virtual void run()
{
while (true)
{
Message msg= queue_.pop();
// do something with the message
if(msg.Text == "BangBang")
{
/// check for hit
// reply to sender
Post("you got me", msg.sender);
}
}
}
现在
Player player1("player1");
Player player2("player2");
thread thread1(&Player::run, player1);
thread thread2(&Player::run, player2);
player2.Post("BangBang", &player1); // send message to player2 (from 1)
为了在class的两个对象之间发送消息! 我实现了这个
class User
{
public:
virtual void run()
{
while (true)
{
string receivedMessage = receiveMessage();
sendMessage(receivedMessage);
}
}
virtual void sendMessage(string message)
{
sentQueue.push(reply);
};
virtual string receiveMessage()
{
string receivedMessage;
receivedMessage = receivedQueue.pop();
return receivedMessage;
};
private:
};
我现在要问的是在哪里实例化这个阻塞队列以在两个对象(用户 1 和用户 2)之间使用它,以便在它们之间交换消息
您有一个全局发送队列和一个全局接收队列。您需要的是每个玩家一个接收队列。
在播放器 class 上有一个发送方法可以写入他们的发送队列
所以玩家 1 会去
player2.Send("hello player2");
怎么做
class Player
{
BlockingQueue<string> queue_ = BlockingQueue<string>();
public:
void Post(const string& message){
queue_.push(message);
}
virtual void run()
{
while (true)
{
string msg= queue_.pop();
// do something with the message
if(msg == "BangBang")
{
}
}
}
现在你可以走了
Player player1("player1");
Player player2("player2");
thread thread1(&Player::run, player1);
thread thread2(&Player::run, player2);
player1.Post("BangBang");
也许你应该让你的信息更多的是一个字符串,比如
class Message{
Player* sender;
string text;
CommandType ct;
}
或具有类似 "player1/shoot/0,5"
的字符串语法你需要知道消息来自谁,这样你才能做出正确的反应并可能回复
或者 post 方法在发送播放器对象上调用并包含目标用户。使用我建议的消息 class
class Player
{
BlockingQueue<Message> queue_ = BlockingQueue<Message>();
public:
void Post(const string& message, Player *dest){
Message msg;
msg.sender= this; // sender
msg.text = message;
dest->queue_.push(message);
}
virtual void run()
{
while (true)
{
Message msg= queue_.pop();
// do something with the message
if(msg.Text == "BangBang")
{
/// check for hit
// reply to sender
Post("you got me", msg.sender);
}
}
}
现在
Player player1("player1");
Player player2("player2");
thread thread1(&Player::run, player1);
thread thread2(&Player::run, player2);
player2.Post("BangBang", &player1); // send message to player2 (from 1)