gpt4 book ai didi

ios - NSOperationQueue 的线程不会消亡

转载 作者:行者123 更新时间:2023-11-29 03:45:58 27 4
gpt4 key购买 nike

抱歉,有点罗嗦,但我想确保我说清楚了! ;-)

我有一个使用 FFMPEG 进行 RTSP 流传输的 iOS 应用程序。我使用 NSOperationQueue 进行多线程 FFMPEG,这样除了将图像绘制到屏幕之外,它的大部分工作当然都发生在后台线程中。效果很好! ...除了 NSOperationQueue 创建的线程永远不会消亡这一事实!

我在类的 init 方法中初始化队列:

self->opQ = [[NSOperationQueue alloc] init];
[self->opQ setMaxConcurrentOperationCount:1];

我使用 block 向队列添加方法:

[self->opQ addOperationWithBlock:^{
[self haveConnectedSuccessfullyOperation];
}];

或者

[self->opQ addOperationWithBlock:^{
if (SOME_CONDITION) {
[self performSelectorOnMainThread:@selector(DO_SOME_CRAP) withObject:nil waitUntilDone:NO];
}
}];

后来,当我需要拆除RTSP流时,除了告诉FFMPEG关闭之外,我还调用:

[self->opQ cancelAllOperations];

这确实会阻止线程执行任何工作,但从未真正销毁它们。下面,您将看到根本不执行任何操作的线程的屏幕截图。这是我的线程在多次启动/停止 FFMPEG 后的样子。

Bad threads

我似乎记得在Apple的文档中读到,NSOperations及其运行的线程一旦执行完毕就会被销毁,除非另有引用。事实似乎并非如此。

我是否只需要销毁 NSOperationQueue,然后在需要再次启动 FFMPEG 时重新初始化它(我刚刚意识到我还没有尝试过这个)?有人知道我需要如何杀死这些额外的线程吗?

谢谢!

最佳答案

我通过创建 NSBlockOperation 解决了这个问题,以便我可以监视 isCancelled 状态,同时也使新的 NSBlockOperation 的内容更加丰富智能,这样我就简化了将操作添加到队列的例程。

...另外,我犯了一个 NSOperationQueue n00b 错误:我在循环的基础上向队列添加操作,每秒最多触发 30 次(与视频的帧速率匹配)。但是现在,该操作仅添加到队列中一次,并且循环行为包含在操作内,而不是让循环将操作添加到队列中。

以前,我有类似的东西(伪代码,因为我没有这个项目):

NSTimer *frameRateTimeout = [NSTimer scheduledTimerWithTimeInterval:1/DESIRED_FRAMES_PER_SECOND target:self selector:@selector(ADD_OPERATION_TO_QUEUE_METHOD:) userInfo:nil repeats:YES];

-(void)ADD_OPERATION_TO_QUEUE_METHOD:(NSTimer *)timer {
[opQ addOperation:displayFrame];
}

这很有效,因为操作系统可以正确管理队列,但效率不是很高,并且使这些线程永远保持事件状态。

现在,它更像是:

-(id)init {
self = [super init];
if (self) {
// alloc/init operation queue
...
// alloc/init 'displayFrame'
displayFrame = [NSBlockOperation blockOperationWithBlock:^{
while (SOME_CONDITION && ![displayFrame isCancelled]) {
if (playVideo) {
// DO STUFF
[NSThread sleepForTimeInterval:FRAME_RATE];
}
else { // teardown stream
// DO STUFF
break;
}
}
}];
}

return self;
}

- (void)Some_method_called_after_getting_video_ready_to_play {
[opQ addOperation:displayFrame];
}

感谢 Jacob Relkin 回复我的帖子。
如果有人需要进一步说明,请告诉我,一旦我再次掌握该项目,我将发布更好的代码。

关于ios - NSOperationQueue 的线程不会消亡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17757813/

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