為了在類的兩個物件之間發送訊息!我實作了這個
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)之間使用它,以便在它們之間交換訊息
uj5u.com熱心網友回復:
您有一個全域發送佇列和一個全域接收佇列。您需要的是每個玩家的接收佇列。
在播放器類上有一個發送方法,可以寫入他們的發送佇列
所以玩家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 方法并包括目標用戶。使用我建議的 Message 類
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)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/472205.html
上一篇:為什么f.seekp(f.tellg())無法運行?
下一篇:使用pandas重命名檔案夾
