UDPreceive 関数をアプリケーションに組み込むことに成功しました。でも!UDPリスナーが無限に実行されるのを止める方法がわかりません。OSCPack ライブラリには Break() と AsynchronousBreak() が組み込まれていますが、これらを実装できませんでした。
oscpack 内の udpSocket.cpp ファイル:
void Run() //the listener function (WORKING!)
{
break_ = false;
//UDP Listener Code
void Break()
{
break_ = true;
}
void AsynchronousBreak()
{
break_ = true;
// Send a termination message to the asynchronous break pipe, so select() will return
write( breakPipe_[1], "!", 1 );
}
}
コンパイラがすべてが正しく呼び出されていることを示唆しているにもかかわらず、パケット Listener クラスから Break() を呼び出そうとしても、何もしないようです。
SocketReceiveMultiplexer s;
s.Break();
私が試した別の方法は、RunUntilSigInt() 関数に従って割り込みフラグを立てることでした。パケット リスナー クラス内:
raise(SIGINT);
ただし、これは UDPListener から単に中断するのではなく、プログラム全体を終了させます。参考までに、udpSocket.cpp 内の RunUntilSigInt() コードを次に示します。
void SocketReceiveMultiplexer::RunUntilSigInt()
{
assert( multiplexerInstanceToAbortWithSigInt_ == 0 ); /* at present we support only one multiplexer instance running until sig int */
multiplexerInstanceToAbortWithSigInt_ = this;
signal( SIGINT, InterruptSignalHandler );
impl_->Run();
signal( SIGINT, SIG_DFL );
multiplexerInstanceToAbortWithSigInt_ = 0;
}
私はこれに完全に行き詰まっています。どんな助けやアドバイスも大歓迎です。
ありがとう、トム