Уведомление из фонового потока в обратном вызове C - PullRequest
3 голосов
/ 20 ноября 2011

Как мое первое приложение для Mac, я создаю приложение, которое отображает входящий MIDI-код времени. Поэтому у меня есть экземпляр «библиотеки» RtMidi, которая упаковывает MIDI-файлы. Обратный вызов MIDI для Mac OS Core находится в пустом C и вызывается внутри нескольких потоков. RtMidi работает на C ++ и перенаправляет этот многопоточный вызов одному единственному (основному) потоку.

Поскольку мне нужна функция Какао для уведомления других классов о поступлении нового временного кода MIDI (что происходит примерно каждые 7-9 мс), я реализовал Singleton, который соблюдают все необходимые классы.

Итак, порядок вызова функций:

    Core MIDI callback -> RtMidi function -> user callback -> Notification ( via Singleton )

В принципе, это работает!

Проблема в том, что у меня сейчас все в одной теме (основной поток). Если я отправляю уведомление от обратного вызова MIDI и вызываемые функции выполняются дольше, чем указанные выше 7-9 мс, обратный вызов Core MIDI блокируется, что приводит к зависанию всего приложения. Я попытался отладить, и, похоже, возникла какая-то тупиковая ситуация.

У кого-нибудь есть несколько указаний о том, как реализовать многопоточность в этом случае? Поскольку я также выполняю обновление пользовательского интерфейса в наблюдателях уведомлений, мне нужно, чтобы все уведомления отображались в главном потоке. Я не понимаю, как обстоят дела с C / C ++ / Objective-C в данном конкретном случае.

1 Ответ

3 голосов
/ 20 ноября 2011

Я бы предложил, чтобы на этапе переадресации вашего вызова из фонового потока в основной поток вы делали это неблокирующим образом, если это возможно. Например, вы можете использовать performSelectorOnMainThread:withObject:waitUntilDone:, передавая NO для последнего аргумента, или какой-то другой механизм, например dispatch_async(dispatch_get_main_queue(), ^{ ... }). Это предотвратит блокировку фонового потока и позволит обновлять пользовательский интерфейс всякий раз, когда у него есть время.

...