TCP接続をカプセル化するTcpDeviceクラスがあります。このクラスには、リモートエンドが電話を切るたびに呼び出されるonRemoteDisconnectメソッドがあります。次に、TcpDeviceを通信チャネルとして使用するTcpSessionオブジェクト を作成し、アプリケーションが使用できるように内部ポインターコンテナーに挿入するSessionManagerオブジェクトがあります。管理対象のTcpSessionのいずれかが終了する必要がある場合は、SessionManagerインスタンスに通知してから、対応するセッションをコンテナーから削除して、それに関連付けられているリソースを解放します。
私の問題はこの質問と非常に似ていることがわかりました。
しかし、彼は接続状態をチェックするためのスレッドを持っているので、それは私のものとは少し異なり、boost :: signalsを使用してそれを解決することを意図していたので、それに向けた新しい質問に行くことにしました-それがそうである場合はお詫びしますそれを行うための間違った方法...私はまだSOを適切に使用する方法についての感触を得ています:)
私はQTシグナル/スロットに精通しているので、 boost :: signalが同様のメカニズムを提供していることがわかりました(私はすでにboost :: asioを使用しており、このプロジェクトにはQTがありません)。そこで、remoteDeviceDisconnectedシグナルを実装することにしました。 TcpDeviceの onRemoteDisconnectによって発行され、 SessionManagerにスロットがあり、切断されたセッションとデバイスがコンテナから削除されます。
最初に試してみるために、tcpdevice.hppでTcpDeviceのパブリックメンバーとしてシグナルを宣言しました。
class TcpDevice
{
(...)
public:
boost::signal <void ()> remoteDeviceDisconnected;
(...)
}
次に、TcpDeviceの onRemoteDisconnectメソッドから次のように出力しました。
remoteDeviceDisconnected();
さて、このシグナルをセッションマネージャー内からSessionManagerスロットに接続する方法はありますか?私はこれを試しました:
unsigned int SessionManager::createSession(TcpDevice* device)
{
unsigned int session_id = session_counter++;
boost::mutex::scoped_lock lock(sessions_mutex);
sessions.push_back(new TcpSession(device, session_id));
device->remoteDeviceDisconnected.connect(boost::bind(&SessionManager::removeDeadSessionSlot, this));
return session_id;
}
正常にコンパイルされますが、リンク時に、いくつかのオブジェクトコードファイルでのremoteDeviceDisconnectedの複数の定義について文句を言います。
tcpsession.cpp.o:(.bss+0x0): multiple definition of `remoteDeviceDisconnected'
tcpdevice.cpp.o: (.bss+0x0): first defined here
sessionmanager.cpp.o:(.bss+0x0): multiple definition of `remoteDeviceDisconnected'
tcpdevice.cpp.o: (.bss+0x0): first defined here
シグナルをどこにも再定義しなかったので、これは奇妙だと思いましたが、上記のcreateSessionメソッドで使用しただけです。
ヒントをいただければ幸いです。ありがとうございました!