Objective c C回调中来自后台线程的通知

Objective c C回调中来自后台线程的通知,objective-c,callback,objective-c++,nsnotifications,coremidi,Objective C,Callback,Objective C++,Nsnotifications,Coremidi,作为我的第一个Mac应用程序,我正在构建一个显示传入MIDI时间码的应用程序。 因此,我有一个RtMidi“库”的实例,它封装了MIDI的输入输出内容。 Mac OS Core MIDI回调是空白C,在内部由多个线程调用。C++中的RTMIDI文件,并将这个多线程调用转发到一个(主)线程。 由于我需要一个Cocoa函数来通知其他类一个新的MIDI时间码已经到达(大约每7-9毫秒发生一次),所以我实现了一个所有必要类都遵守的单例 因此,调用函数的顺序是: Core MIDI callbac

作为我的第一个Mac应用程序,我正在构建一个显示传入MIDI时间码的应用程序。 因此,我有一个RtMidi“库”的实例,它封装了MIDI的输入输出内容。 Mac OS Core MIDI回调是空白C,在内部由多个线程调用。C++中的RTMIDI文件,并将这个多线程调用转发到一个(主)线程。 由于我需要一个Cocoa函数来通知其他类一个新的MIDI时间码已经到达(大约每7-9毫秒发生一次),所以我实现了一个所有必要类都遵守的单例

因此,调用函数的顺序是:

    Core MIDI callback -> RtMidi function -> user callback -> Notification ( via Singleton )
基本上,这是有效的

问题是我现在所有的东西都在同一个线程(主线程)上。如果我发布来自MIDI回调的通知,并且调用的函数需要比上述7-9毫秒更长的时间才能完成,那么核心MIDI回调将被阻塞,从而导致整个应用程序冻结。 我尝试过调试,但似乎出现了某种死锁

在这种情况下,有人对如何实现多线程有一些指导吗?
正如我在通知观察员中进行UI更新一样,我需要所有通知都显示在主线程上。我不理解的是,在这个特殊的情况下,所有的事情都与C/C++ + Objul-C一起进行。

< P>我建议,在这个阶段,你可以将你的调用从后台线程转发到主线程,如果可能的话,你可以以非阻塞的方式进行。例如,您可以使用
performSelectorOnMainThread:withObject:waitUntilDone:
,为最后一个参数传递NO,或者其他一些机制,如
dispatch\u async(dispatch\u get\u main\u queue(),^{…})
。这将防止后台线程被阻塞,并允许用户界面在有时间时进行更新。

谢谢您的回答。我尝试了一下,发现只有GCD方法,也就是
dispatch\u async(…
实际上在不阻止应用程序的情况下工作。我正试图在
调度\u async
机制中获取另一个队列以获得最高优先级。这也阻止了应用程序…有没有办法确保立即发布通知?提前谢谢!!我不确定“立即”是什么意思;如果你不阻止,除了“尽快”之外,你真的无法得到任何关于时间安排的保证。非常感谢。如果一切顺利,我想我必须试试。