作为我的第一个Mac应用程序,我正在构建一个显示传入MIDI时间码的应用程序。 因此,我有一个RtMidi“库”的实例,它包装了MIDI输入和输出的东西。 Mac OS Core MIDI回调在空白C中,并在内部多线程上调用。 RtMidi用C ++编写,并将这个多线程调用转发给一个(主)线程。
由于我需要一个Cocoa函数来通知其他类新的MIDI时间码已经到达(大约每7-9毫秒发生一次),我实现了一个所有必要类都观察到的Singleton。
因此,调用函数的顺序是:
Core MIDI callback -> RtMidi function -> user callback -> Notification ( via Singleton )
基本上,这有效!
问题是我现在拥有同一个线程(主线程)上的所有内容。如果我从MIDI回调发布通知并且被调用的函数需要比上述7-9 ms更长的时间来完成,则核心MIDI回调会被阻止,这会导致整个应用程序冻结。 我试过调试,似乎发生了某种死锁。
在这种情况下,任何人都有关于如何实现多线程的一些指示? 由于我也在通知观察器中进行UI更新,我需要所有通知都出现在主线程上。我不明白的是在这种特殊情况下C / C ++ / Objective-C的一切如何。
答案 0 :(得分:3)
如果可能的话,我建议您在从后台线程转发到主线程的阶段,以非阻塞方式执行此操作。例如,您可以使用performSelectorOnMainThread:withObject:waitUntilDone:
,为最后一个参数传递NO,或者使用dispatch_async(dispatch_get_main_queue(), ^{ ... })
之类的其他机制。这将阻止您的后台线程被阻止,并允许在有时间的情况下更新UI。