【发布时间】:2011-03-02 00:21:30
【问题描述】:
我正在创建一个用于 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];
});
}
这具有相同的行为。也就是说,视频帧的回调不会触发。跛脚
为什么主 NSRunLoop 在第 2 和第 3 种情况下被阻塞?有没有办法将队列与之关联?
这有意义吗?
【问题讨论】:
标签: iphone ios grand-central-dispatch nsrunloop avcapturesession