gpt4 book ai didi

iphone - NSRunLoop 和 GCD 队列

转载 作者:行者123 更新时间:2023-12-03 19:59:51 26 4
gpt4 key购买 nike

我正在创建一个在 iOS 上使用的 C++ 库(是的,不幸的是它必须是 C++),它使用 AVCaptureSession 来捕获视频帧,这些视频帧通过 captureOutput 回调传递。 C++ 库是我的可交付产品。我有一个 cocoa touch 应用程序来测试/演示它。所以,它看起来像这样:

(测试应用程序)<----->(c++ lib(AVFoundation 回调))

测试应用程序具有 UI 控件,负责几乎所有图形。 C++ 库通过 OpenGL 将帧渲染到 UIView。

你和我在一起吗?好

<小时/>

好吧,首先,用户按下一个 UIButton,它会调用我的库。此调用需要 10 秒或更长时间才能完成。因此,如果我将调用直接放在按钮单击后面,则 UI 将被阻塞,直到库函数返回:

-(IBAction)hBut:(id)sender{
[myLib foo]; // takes 10+ seconds to return
}

这可不好。我尝试的下一件事是生成一个线程来调用库:

-(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 种情况下被阻塞?有没有办法将队列与其关联起来?

这有意义吗?

最佳答案

主线程自行运行其 runLoop,因此在第一种情况下来自相机的事件被传递到您的库。自定义线程不运行 runLoop,您应该自己执行。

-(void)callIntoLib {
[myLib foo];
self.callIntoLibExecuted = YES;
}


-(void)threadBody {
@autoreleasepool {
self.callIntoLibExecuted = NO;

[self performSelector:@selector(callIntoLib)
onThread:[NSThread currentThread]
withObject:nil
waitUntilDone:NO];

while (!self.callIntoLibExecuted)
{
@autoreleasepool {
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode
beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]];
}
}
}
}

-(IBAction)hBut:(id)sender {
[NSThread detachNewThreadSelector:@selector(threadBody)
toTarget:self withObject:nil];
}

关于iphone - NSRunLoop 和 GCD 队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5162043/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com