作为我的第一个Mac应用程序,我正在构建一个显示传入MIDI时间码的应用程序。因此,我有一个RtMidi“库”的实例,它包装了MIDI的输入和输出内容。Mac OS Core MIDI回调使用空白C,并在内部的多个线程上调用。RtMidi填充在C++中,并将这个多线程调用转发给一个单独的(主)线程。
因为我需要一个Cocoa函数来通知其他类一个新的MIDI时间码已经到达(大约每隔7-9ms发生一次),所以我实现了一个单例,所有必要的类都可以观察它。
因此,函数被调用的顺序是:
Core MIDI callback -> RtMidi function -> user callback -> Notification ( via Singleton )基本上,这是可行的!
问题是我现在把所有的东西都放在同一个线程(主线程)上。如果我发布来自MIDI回调的通知,并且调用的函数的完成时间超过上述7-9毫秒,则核心MIDI回调被阻塞,从而导致整个应用程序冻结。我试着调试,似乎发生了某种死锁。
有谁有关于如何在这种情况下实现多线程的指导吗?由于我还在通知观察器中进行UI更新,因此我需要所有通知都出现在主线程上。我不明白的是,在这种特殊的情况下,C/ C++ / Objective-C是如何处理所有事情的。
发布于 2011-11-20 11:10:52
我建议您在将调用从后台线程转发到主线程的阶段,尽可能以非阻塞的方式这样做。例如,您可以使用performSelectorOnMainThread:withObject:waitUntilDone:,为最后一个参数传递NO,或者使用像dispatch_async(dispatch_get_main_queue(), ^{ ... })这样的其他机制。这将防止您的后台线程被阻塞,并允许UI在有时间时进行更新。
https://stackoverflow.com/questions/8197852
复制相似问题