3

我正在嘗試構建一個必須管理自己的運行循環的應用程序。我想在這個應用程序中使用libdispatch。但是,使用libdispatch需要調用dispatch_main(),這是一種阻塞方法。我無法阻止主線程。將自定義運行循環與libdispatch集成

  1. 是否有整合與libdispatch運行自定義循環而不使用阻斷dispatch_main()的方法嗎?
  2. 我在libdispatch的queue.c中看到對_dispatch_main_queue_callback_4CF的引用,這看起來很有希望。有沒有辦法使用這種方法來實現相同?這種方法的文檔相當稀少。
  3. 理想情況下,我不需要使用NSRunLoop/CFRunLoop。

回答

8

libdispatch不需要調用dispatch_main(),它通過調度主隊列主線程的runloop集成,見dispatch_get_main_queue(3)COMPATIBILITY部分在其中。

不調用dispatch_main()並且想要使用主隊列的可執行文件必須以調度主隊列上要處理的塊的通用模式之一運行主線程runloop;通過標準框架方法(例如NSApplicationMain())或直接通過CFRunLoop或NSRunLoop API進行間接。

請不要試圖使用_dispatch_main_queue_callback_4CF符號,它是庫內部的實現細節,將來很可能會發生更改,並且任何依賴它的代碼都會在沒有警告的情況下中斷。

將libdispatch與自定義非主線程CFRunLoops集成可以通過多種方式實現,例如通過CFRunLoopPerformBlock() API或自定義runloop源。


更新:在Linux上,你就必須修改libdispatch來源,有一個自定義的互操作沒有現有的支持runloops AFAIK。

到主隊列在Linux上現有的runloop整合最簡單的方法可能是的確將是通過事件循環每次調用(最好改名)_dispatch_main_queue_callback_4CF()功能,並更換 _dispatch_queue_wakeup_main()用任何方法是適當的喚醒你的runloop(例如寫入runloop正在等待的管道)。

+0

我想在Linux系統上使用libdispatch(如果是NSRunLoop/CFRunLoop限制)。我想我應該在我原來的帖子中更清楚一點。我正在使用Debian libdispatch源代碼(libkern/libpthread_workqueue/libkqueue)。 – Buzzy 2012-04-24 06:08:36

+0

這完全正確。我自己也是到了類似的解決方案。萬分感謝! – Buzzy 2012-04-24 07:11:11