作爲我的第一個Mac應用程序,我正在構建一個顯示傳入的MIDI時間碼的應用程序。 因此,我有一個RtMidi「庫」的實例,它包裝了MIDI進出的東西。 Mac OS Core MIDI回調空白C,並在內部的多個線程上調用。 RtMidi用C++編寫的東西,並將這個多線程調用轉發給一個(主)線程。C回調中的後臺線程通知
因爲我需要一個可可功能,以通知一個新的MIDI時間碼已經到達其他類(發生大約每7-9毫秒),我實現一個Singleton所有必需的類觀察。
所以,在函數調用的順序是:
Core MIDI callback -> RtMidi function -> user callback -> Notification (via Singleton)
基本上,這個作品!
問題是,我現在擁有同一線程(主線程)上的所有內容。如果我發佈來自MIDI回調的通知,並且所調用的功能需要比上述7-9毫秒更長的時間完成,則Core MIDI回調會被阻止,從而導致整個應用程序凍結。 我試過調試,似乎有某種類型的死鎖發生。
任何人在這種情況下如何實現多線程的一些方向? 因爲我還在通知觀察者中進行UI更新,所以我需要所有通知出現在主線程中。我不明白的是在這種特殊情況下,所有的東西都是如何與C/C++/Objective-C一起使用的。
感謝您的回答。我嘗試了一下,發現只有GCD方法,意思是'dispatch_async(...'實際上沒有阻塞應用程序,我試圖在'dispatch_async'機制中獲得另一個隊列來獲得最高優先級,這也阻止了應用程序......任何想法如何能確保通知立即發佈?在此先感謝!! – guitarflow
我不確定你的意思是「立即」;如果你不' t塊,你不能真正得到任何超越「儘快」的時間保證 –
非常感謝,我想我將不得不嘗試一切工作。 – guitarflow