以下のコードの通り、一応の解決案は持っているのですが、
よりシンプルな案はないかと思ったので質問させていただきます。
以下のような条件をお考えください。
・ある機械がある
・その機械は何らかの通信をし、通信データを受信する受信部を持っている
・機械は、受信内容に合わせて何かしらのアクションを取る
そこで以下のようにクラスを実装したいです。
・機械のためのMachineクラスを作る
・受信部のためのReceiverクラスを作る
・MachineクラスはReceiverクラスをメンバとして所有する
・Receiverクラスはstart()メソッドを持ち、その中で延々と受信ループを回す
・Receiverは受信だけに専念し、Machineが受信内容に対してどういうアクションを取るかは関知しない
このとき、Receiverが受信ループの中で受信した内容を、Machineクラスにどうやって伝え、
そしてMachineクラスの受信内容に対するアクションの実装は、どのようにしたらよいでしょうか。
Receiverクラスは受信だけに専念するクラスなので、そもそもMachineクラスの存在など知りません。
私の一つの解決案?は以下ですが、もっと少し簡単な方法があれば知りたいです。
cpp
1#include <iostream> 2#include <unistd.h> 3#include <string> 4 5class ReceiveHandler { // 受信ハンドラインターフェース 6public: 7 virtual void onReceive(std::string msg) = 0; 8}; 9 10class Receiver { 11private: 12 ReceiveHandler* handler_; 13public: 14 void setReceiveHandler(ReceiveHandler* handler) { 15 handler_ = handler; 16 } 17 void start() { 18 while(true) { // 受信ループ 19 std::string msg = "hoge"; // 本当は msg = wait_receive() みたいな感じ 20 handler_->onReceive(msg); 21 sleep(1); // 本当は要らない 22 } 23 } 24}; 25 26class Machine : ReceiveHandler { // Machine自信が受信ハンドラインターフェースになる 27private: 28 Receiver receiver_; 29public: 30 Machine() { 31 receiver_.setReceiveHandler(this); // 自分自身を受信ハンドラとしてセット 32 } 33 void onReceive(std::string msg) { 34 std::cout << "Message Received: " << msg << std::endl; 35 } 36 void startReceive() { 37 receiver_.start(); 38 } 39}; 40 41int main(void) { 42 Machine machine; 43 machine.startReceive(); 44 45 return 0; 46} 47 48
これを実行すると、1秒おきに
Message Received: hoge
が表示されます。
これが普通のやり方なのか、もっと簡単な方法があるのか、気になっております。
なお受信メッセージをReceiver.start()内でキューイングして、Machine側でキューをポーリングして取り出す、というのは
あまり考えておりません。リアルタイム性が怪しくなるためです。
あくまで、受信したら受信内容に対するアクションを即時に起こさせたいです。
アドバイスいただきたく、よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/05/13 14:06
2017/05/13 15:09
2017/05/16 13:24