3

作爲我的第一個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一起使用的。

回答

3

我建議,在您從後臺線程轉發您的電話到您在非阻塞的方式做到這一點,如果可能的話主線程的階段。例如,您可以使用performSelectorOnMainThread:withObject:waitUntilDone:,將最後一個參數的NO或其他機制(如dispatch_async(dispatch_get_main_queue(), ^{ ... }))傳遞給NO。這將防止後臺線程被阻止,並且允許在有時間的時候更新UI。

+0

感謝您的回答。我嘗試了一下,發現只有GCD方法,意思是'dispatch_async(...'實際上沒有阻塞應用程序,我試圖在'dispatch_async'機制中獲得另一個隊列來獲得最高優先級,這也阻止了應用程序......任何想法如何能確保通知立即發佈?在此先感謝!! – guitarflow

+0

我不確定你的意思是「立即」;如果你不' t塊,你不能真正得到任何超越「儘快」的時間保證 –

+0

非常感謝,我想我將不得不嘗試一切工作。 – guitarflow