Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么我在Mac上使用一段时间后不再接收OSC消息?_C#_Macos_Unity3d_Udpclient_Osc - Fatal编程技术网

C# 为什么我在Mac上使用一段时间后不再接收OSC消息?

C# 为什么我在Mac上使用一段时间后不再接收OSC消息?,c#,macos,unity3d,udpclient,osc,C#,Macos,Unity3d,Udpclient,Osc,我正在开发一款Unity游戏,它可以从Muse EEG耳机接收OSC信息。我尝试了两个第三方C#库来处理OSC通信,以及。两者都实现了与底层System.Net.Sockets.UdpClient的OSC通信。在Windows上,一切都运行得很顺利,但在OSX上,过了一段时间,我每次都不再接收消息。没有异常或错误消息,没有任何错误指示,只有沉默 我的应用程序大致如下所示: 启动一个线程,生成一个运行Muse IO的进程。这会使耳机开始发送信息。启动该进程后,该线程正在process.Waitf

我正在开发一款Unity游戏,它可以从Muse EEG耳机接收OSC信息。我尝试了两个第三方C#库来处理OSC通信,以及。两者都实现了与底层
System.Net.Sockets.UdpClient
的OSC通信。在Windows上,一切都运行得很顺利,但在OSX上,过了一段时间,我每次都不再接收消息。没有异常或错误消息,没有任何错误指示,只有沉默

我的应用程序大致如下所示:

  • 启动一个线程,生成一个运行Muse IO的进程。这会使耳机开始发送信息。启动该进程后,该线程正在
    process.WaitforExit()
  • 另一个线程运行while循环—不在
    monobhavior.Update()
    ,速度不够快—它一直在接收和处理OSC消息。在这两个库中,这基本上归结为调用
    UdpClient.Receive()
  • 游戏在正常的Unity更新周期中使用处理过的消息
在连接初始化后大约120到140秒,消息流就停止了,到目前为止我还不知道为什么。耳机上的连接指示灯一直亮着,但没有任何东西表明它仍在发送数据

我排除的事情:

  • 这不是因为消息的数量或消息的大小。如果我修改对耳机的命令,只发送某些类别的信息,将总数减少一半(从大约600/s减少到300/s),超时仍然会同时发生
  • 这不是OSC图书馆。我在两个OSC库中得到了完全相同的结果
  • 这不是防火墙。防火墙关闭了
  • 它可能不是被其他东西使用的端口。我尝试了不同的端口,结果相同
  • 它似乎不是Muse的OSX驱动程序。当我使用他们的GUI来可视化传入的数据时,它会一直接收我想要的数据
我怀疑Mono、Unity或OSX可能正在关闭(垃圾收集?)Muse IO进程或线程,因为无论我如何尝试,问题发生之前的时间似乎都是非常恒定的。但我不确定如何进一步诊断,更不用说现在修复了。任何线索、建议或令人惊讶的解决方案都将受到欢迎。

我找到了原因

生成I/O进程后,线程将执行以下操作

print("Process started!");
process.PriorityClass = ProcessPriorityClass.High;
process.WaitforExit();
事后看来,那份书面声明的位置真的很糟糕。它在窗户上工作得很好。更改进程优先级仅需要管理员权限(如果要将其增加到实时)。但在Mac上不是这样。显然,将其设置为高还需要提高OSX的权限。产生的异常是静默的/未检测到的/未捕获的,因为它发生在主线程之外

然后,几分钟后,线程似乎被垃圾收集,包括它的子进程,即使它仍在运行。那次耽搁真的把我甩了,让我在所有错误的地方寻找原因

经验教训:

  • 在进行多线程处理时,请更加小心可能出现的异常
  • 如果不一定非要,请不要干扰流程优先级
  • 永远不要相信医生

我意识到这是一个非常具体/狭窄的问题,但我真的希望有人能帮我解决。我会尽快悬赏的,好吧,解决了。我发布了解决方案,以防有人遇到类似的问题,但我想终究不会有悬赏。