Как мое первое приложение для 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 в данном конкретном случае.