gpt4 book ai didi

C++ 中断 UDP 监听器。在 Xcode 中使用 oscpack 编译

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:19:52 28 4
gpt4 key购买 nike

我已经成功地将 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 );
}
}

我尝试从数据包监听器类调用 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;
}

我完全坚持这一点,任何帮助/建议将不胜感激。

谢谢,汤姆

最佳答案

我知道这是一个有点老的问题,但我最近不得不克服这个问题并且没有在网上找到好的答案。 oscpack 使用的模型似乎是他们控制无限 Run循环,然后在派生自 OscPacketListener 的类中实现所有你想做的事情。如果你不想那样做,你需要运行 Run在单独的线程中循环。似乎在 oscpack 1.1.0 版本中,不再有对线程的内部支持。他们在 CHANGES 中解释该版本的文件,您将需要实现自己的线程解决方案。 Run SocketReceiveMultiplexer 中的例程永远不会返回,因此该调用之后的任何代码都无法访问。各种Break例程用于控制 Run 的执行从不同的线程循环。在下面的示例中,我使用的是 c++11 <threads>但是您可以使用您选择的任何线程库来完成类似的事情。在我的示例中,您必须

#include <threads>
#include <mutex>

并使用兼容 C++11 的编译器编译您的代码。在 g++ 中你需要 -std=c++11命令行参数。

如果您从 receiver example 开始(解析单个消息示例)在 SVN 中,您可以更改 main()功能类似于

void ListnerThread()
{
PacketListener listener;
UdpListeningReceiveSocket s(
IpEndpointName( IpEndpointName::ANY_ADDRESS, PORT ),
&listener );
s.Run();
}

在你代码的其他地方,像这样调用

std::thread lt(ListnerThread);

为了启动监听器运行。您必须创建一些在主线程和监听器线程之间共享信息的方法。一种简单的方法是使用一个被互斥体包围的全局变量(也是全局变量)。当然还有其他(更好的?)方法,但这很容易。全局声明这些(按照他们的例子)而不是在 ProcessMessage 中声明功能:

std::mutex oscMutex;

bool a1;
osc::int32 a2;
float a3;
const char *a4;

ExamplePacketListener里面,他们在其中设置来自 args 的变量流然后调用电话 cout你会做类似的事情

oscMutex.lock();
args >> a1 >> a2 >> a3 >> a4 >> osc::EndMessage;
oscMutex.unlock();

请务必也 lock()unlock()无论您在代码的其他什么地方访问这些变量,都以相同的方式访问互斥体。

关于C++ 中断 UDP 监听器。在 Xcode 中使用 oscpack 编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25937735/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com