Iphone 线程正在被操作系统终止

Iphone 线程正在被操作系统终止,iphone,ios,multithreading,ipad,Iphone,Ios,Multithreading,Ipad,我目前正在编写一个从电影剪辑中提取帧的应用程序。我设计它是为了在一个单独的线程上进行提取,以防止应用程序冻结。提取过程本身占用大量资源,但在模拟器中使用时效果良好。然而,在为iPad构建时也存在一些问题。当我执行另一个动作时(我告诉我的AV播放器在提取帧时播放),线程意外停止工作,我相信它被杀死了 我想这是因为我使用了很多资源,但并不完全确定 以下是我的问题: 1.如何判断线程是否停止/为什么停止? 2.如果真的是因为过度加工,我该怎么办?我真的需要实施这一行动 下面是我使用的一些代码: 要创建

我目前正在编写一个从电影剪辑中提取帧的应用程序。我设计它是为了在一个单独的线程上进行提取,以防止应用程序冻结。提取过程本身占用大量资源,但在模拟器中使用时效果良好。然而,在为iPad构建时也存在一些问题。当我执行另一个动作时(我告诉我的AV播放器在提取帧时播放),线程意外停止工作,我相信它被杀死了

我想这是因为我使用了很多资源,但并不完全确定

以下是我的问题: 1.如何判断线程是否停止/为什么停止? 2.如果真的是因为过度加工,我该怎么办?我真的需要实施这一行动

下面是我使用的一些代码: 要创建线程,请执行以下操作:

[NSThread detachNewThreadSelector:@selector(startReading)to target:self with object:nil]

我会发布你需要的任何信息, 非常感谢

更新 我现在正在使用GCD,它为我填充线程。但是,操作系统仍然会杀死线程

我确切地知道这是什么时候发生的。当我告诉我的[AVplayer play];它杀死了线


这个问题只会发生在实际的iPad上,而不会发生在模拟器上

当某些东西在模拟器中工作而在设备上不工作时,一个明显的解释就是资源约束问题。但有时模拟器也无法准确模拟设备功能的其他方面。所以我想知道是否还有其他的解释。我想到的一种可能性是,这可能是对AV资产的有限资产访问的竞争,这意味着当你开始播放它时,它也不再可以被处理(出于某种原因,模拟器中的一个bug没有显示此限制)

在苹果州:

虽然最终您希望使用资产,但并不直接向AVPlayer对象提供资产。相反,您提供了一个AVPlayerItem实例。播放器项管理与其关联的资产的显示状态。播放器项包含与资源中的曲目相对应的AVPlayerItemTrack的播放器项曲目实例

这种抽象意味着您可以同时使用不同的玩家玩给定的资产,但每个玩家以不同的方式渲染。例如,使用“曲目”项,可以在播放过程中禁用特定曲目(您可能不想播放声音组件)

所以我想知道您是否使用AVPlayerItems来访问您的资产,这会让两个操作同时发生吗?如果是这样,至少该特定方向被排除在外。但如果没有,可能值得调查,看看它是否解决了问题


可能是在抓救命稻草。但可能会有什么结果。

在《苹果线程编程指南》第27页的“设置线程堆栈大小”一节中说:

在iOS和Mac OS X v10.5及更高版本中,分配并初始化 NSThread对象(不要使用detachNewThreadSelector:toTarget: withObject:方法)

尽管在第22页中说
detachNewThreadSelector
是使用NSThread创建线程的方法之一

第23页给出了如何启动线程的示例:

NSThread* myThread = [[NSThread alloc] initWithTarget:self selector:@selector(myThreadMainMethod:) object:nil];
[myThread start];
根据将在应用程序中创建分离线程的指南。尝试以这种方式创建线程,看看操作系统是否停止杀死线程

以下是指南的链接以供参考

第29页还提到,如果你的应用程序使用了托管内存模型,那么在你的线程进入例程中创建一个自动释放池应该是你做的第一件事,同样地,销毁它应该是你的线程做的最后一件事。不确定不这样做会导致线程终止,但请验证您是否这样做

在线程输入例程中使用try/catch块可能无法解决kill问题,但可以避免在线程中发生错误时退出应用程序

我忘了提到另一个可以帮助您解决资源约束的设计技巧,正如Duncan提到的。根据指南第18页:

避免共享数据结构

避免使用线程相关资源的最简单方法 冲突是为程序中的每个线程提供其自己的 不管它需要什么数据。当您最小化 线程之间的通信和资源争用


我认为你可以在你的应用程序中做到这一点。除了做Duncan提到的“不要直接向AVPlayer对象提供资产,而是提供AVPlayerItem的实例”之外,还要为每个线程创建单独的实例,一个用于播放器线程的AVPlayerItem实例和一个用于提取线程的AVPlayerItem实例。

在我看来,您似乎在尝试同时解码两个视频剪辑。由于iPad基于硬件的解码特性,它一次只能支持一个解码过程。播放新项目时,旧项目将被取消。这可以解释为什么它可以在模拟器中工作,但不能在设备上工作


至于解决方案,您可以切换到纯软件解码器,如(GPL)或(商用)。这样,您就不会干扰用于播放的硬件解码器。

如果必须询问,请尝试使用更高级别的抽象,如调度队列(GCD)或操作队列(NSOperationQueue)。请参阅以获取扩展的讨论,或查找示例或示例。这是非常有用的东西。你的应用程序崩溃了吗?如果是这样,坠机报告怎么说?你确定AVPlayer是线程安全的吗?因为如果您在后台线程中调用[AVplayer play]并同时访问它,这可能就是问题所在。您的提取线程是否作为后台线程运行?我正在学习Objective-C,但是,如果您能够将其作为后台线程运行,则可以