為了在類的兩個物件之間發送訊息!
我實作了一個阻塞佇列,它管理兩個執行緒之間的同步,以同步的方式推送和彈出訊息。
這是阻塞佇列類:
template <typename T>
class BlockingQueue
{
public:
void push(T const& val)
{
{
std::unique_lock<std::mutex> lck_(this->m_);
queue_.push(val);
}
this->cv_.notify_one()
}
T pop()
{
std::unique_lock<std::mutex> lck_(this->m_);
while (this->queue_.empty())
{
this->cv_.wait(lck_)
}
T value(std::move(this->queue_.pop()));
this->queue_.pop();
return value;
}
private:
std::mutex m_;
std::condition_variable cv_;
std::queue<T> queue_;
};
BlockingQueue<string> sentQueue = BlockingQueue<string>();
BlockingQueue<string> receivedQueue = BlockingQueue<string>();
class Player
{
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/shujuku/469969.html