首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C回调中来自后台线程的通知

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

Stack Overflow用户
提问于 2011-11-20 06:26:00
回答 1查看 1.1K关注 0票数 3

作为我的第一个Mac应用程序,我正在构建一个显示传入MIDI时间码的应用程序。因此,我有一个RtMidi“库”的实例,它包装了MIDI的输入和输出内容。Mac OS Core MIDI回调使用空白C,并在内部的多个线程上调用。RtMidi填充在C++中,并将这个多线程调用转发给一个单独的(主)线程。

因为我需要一个Cocoa函数来通知其他类一个新的MIDI时间码已经到达(大约每隔7-9ms发生一次),所以我实现了一个单例,所有必要的类都可以观察它。

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

代码语言:javascript
复制
    Core MIDI callback -> RtMidi function -> user callback -> Notification ( via Singleton )

基本上,这是可行的!

问题是我现在把所有的东西都放在同一个线程(主线程)上。如果我发布来自MIDI回调的通知,并且调用的函数的完成时间超过上述7-9毫秒,则核心MIDI回调被阻塞,从而导致整个应用程序冻结。我试着调试,似乎发生了某种死锁。

有谁有关于如何在这种情况下实现多线程的指导吗?由于我还在通知观察器中进行UI更新,因此我需要所有通知都出现在主线程上。我不明白的是,在这种特殊的情况下,C/ C++ / Objective-C是如何处理所有事情的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-11-20 11:10:52

我建议您在将调用从后台线程转发到主线程的阶段,尽可能以非阻塞的方式这样做。例如,您可以使用performSelectorOnMainThread:withObject:waitUntilDone:,为最后一个参数传递NO,或者使用像dispatch_async(dispatch_get_main_queue(), ^{ ... })这样的其他机制。这将防止您的后台线程被阻塞,并允许UI在有时间时进行更新。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8197852

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档