【发布时间】:2011-11-19 22:26:00
【问题描述】:
作为我的第一个 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++/Objective-C 的一切如何。
【问题讨论】:
标签: objective-c callback objective-c++ nsnotifications coremidi