私は iOS で使用するための C++ ライブラリを作成しています (はい、残念ながら C++ でなければなりません)。AVCaptureSession を使用して、captureOutput コールバックを介して配信されるビデオ フレームをキャプチャします。C++ ライブラリは私の成果物です。テスト/デモ用のココアタッチアプリケーションがあります。したがって、次のようになります。
(テストアプリ) <-----> (c++ lib(AVFoundation コールバック))
テスト アプリには UI コントロールがあり、ほぼすべてのグラフィックを担当します。C++ ライブラリは、フレームを OpenGL 経由で UIView にレンダリングします。
私と一緒にいますか?良い
さて、まず、ユーザーは私のライブラリを呼び出す UIButton を押します。この呼び出しが完了するまでに 10 秒以上かかります。したがって、ボタン クリックの直後に呼び出しを配置すると、ライブラリ関数が戻るまで UI がブロックされます。
-(IBAction)hBut:(id)sender{
[myLib foo]; // takes 10+ seconds to return
}
これはダメです。次に試したのは、スレッドを生成して lib を呼び出すことでした。
-(void)callIntoLib{
[myLib foo];
}
-(IBAction)hBut:(id)sender{
[NSThread detach..:myLib selector:foo object:nil];
}
これにより UI がブロックされることはなくなりましたが、ビデオ フレームのコールバック関数が起動することはなくなりました (AVCaptureSession の captureOutput)。メインの NSRunLoop がブロックされているようです。
次に、同じことを試しましたが、Grand Central Dispatch を使用しました。
-(IBAction)hBut:(id)sender{
_myQueue = dispatch_queue_create("com.domain.me", NULL); // member variable
dispatch_async(_myQueue,
^{
[myLib foo];
});
}
これは同じ動作をします。つまり、ビデオ フレームのコールバックは発生しません。ラメ
2 番目と 3 番目のケースでメインの NSRunLoop がブロックされるのはなぜですか? キューを関連付ける方法はありますか?
これは理にかなっていますか?