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