我一直在为iOS开发一个opencv项目。我得到了一个简单的项目,开始使用捕获和显示的帧进行开发。在我开始记忆问题并追溯到原始项目设置之前,我从未注意过它是如何工作的。我现在打算重新编写捕获/显示代码,但我不明白它为什么起作用。有一个播放/暂停按钮,它调用的方法iOS自动穿线?
- (IBAction)play_pause:(id)sender
{
play = !play;
while(play)
{
if (_videoCapture && _videoCapture->grab())
{
(*_videoCapture) >> _display_frame;
//process frame
self.imageView.image = [UIImage imageWithCVMat:_display_frame];
}
}
}
该剧只是表示该应用程序是否正在播放或暂停一个全球性的布尔。奇怪的是,处理应该在无限循环内进行,没有出路。在循环内从不修改播放。尽管如此,当应用程序运行时,播放/暂停按钮保持响应,并且能够翻转播放布尔并暂停执行。不仅如此,其他布尔(例如use_greyscale)可以被其他按钮翻转,并且它们的值在循环内部改变。我本来希望应用程序冻结,甚至从未画出新的画面。应用程序应该一直处于该函数的大部分生命周期内,无法执行其他任务,如绘图和UIControl。看起来好像这是可能的唯一方法是如果IBAction调用运行在它自己的线程上。我在源代码中找不到任何线程的证据。有人能解释一下苹果如何在UI中处理线程吗?我的印象是有一个主循环线程,并且没有自动创建多余的线程。如果那是真的,这个行为怎么解释呢?
侧笔记记录
什么终于让我调查这是[UIImage的imageWithCVMat:_display_frame]返回一个自动释放的对象。由于所有这些都发生在一个循环中,所以如果没有导致崩溃的执行被暂停,对象就不能被释放。
我用你的测试,它说主线程运行整个时间。我还将该测试放在由其他按钮触发的函数调用中,以更改变量和布尔值,所有这些都在play/pause无限循环内更新了其值。我找不到[NSThread isMainThread]评估为NO的地方 – Hammer