3

独自の実行ループを管理する必要のあるアプリケーションを構築しようとしています。このアプリケーションでlibdispatchを使用したいと思います。ただし、libdispatchを使用するには、ブロッキングメソッドであるdispatch_main()を呼び出す必要があります。メインスレッドでブロックできません。

  1. ブロッキングdispatch_main()を使用せずに、カスタム実行ループをlibdispatchと統合する方法はありますか?
  2. libdispatchのqueue.cに_dispatch_main_queue_callback_4CFへの参照があります。これは有望に見えます。この方法を使用して同じことを達成する方法はありますか?このメソッドに関するドキュメントは非常にまばらです。
  3. 理想的には、NSRunLoop/CFRunLoopを使用する必要はありません。
4

1 に答える 1

8

libdispatchは呼び出す必要がなくdispatch_main()、ディスパッチメインキューを介してメインスレッドのrunloopと統合されます。dispatch_get_main_queue(3)およびそのCOMPATIBILITYセクションを参照してください。

メインキューを呼び出さずdispatch_main()に使用する実行可能ファイルは、ディスパッチメインキュー上のブロックを処理するための共通モードの1つでメインスレッドrunloopを実行する必要があります。標準のフレームワークメソッド(例)を介して間接的に、NSApplicationMain()またはCFRunLoopまたはNSRunLoopAPIを介して直接。

シンボルを使用しようとしないでください。_dispatch_main_queue_callback_4CFこれはライブラリ内部の実装の詳細であり、将来変更される可能性が非常に高く、シンボルに依存するコードは警告なしに破損します。

libdispatchとカスタムの非メインスレッドCFRunLoopsの統合は、CFRunLoopPerformBlock()APIやカスタムのrunloopソースなど、さまざまな方法で実現できます。


更新: Linuxでは、libdispatchソースを変更する必要があります。カスタムrunloopsAFAIKとの相互運用に対する既存のサポートはありません。

Linuxでメインキューを既存のrunloopと統合する最も簡単な方法は、おそらく_dispatch_main_queue_callback_4CF()イベントループを介して毎回(できれば名前を変更した)関数 を呼び出し、 _dispatch_queue_wakeup_main()runloopをウェイクアップするのに適切なメソッドに置き換えることです(たとえば、 runloopが待機しているパイプ)。

于 2012-04-24T05:30:49.083 に答える