【发布时间】:2012-11-08 12:49:53
【问题描述】:
我在异步(串行)工作队列中有一个长时间运行的函数。 我知道有时这个函数会挂在特定的 openCV 调用中。 由于某种原因,这种挂起也会导致主线程挂起。 暂停并进入调试模式时,我看到有人调用
semaphore_wait_trap()
在主线程(队列)上
我可以在调试模式下挂起挂起的线程(我的工作队列),然后这个陷阱消失,GUI 再次在手机上响应。
取消暂停工作线程后,GUI 会响应 1-2 秒(我怀疑直到再次激活该线程),然后 UI 再次变得无响应。
此线程不对主线程/队列进行dispatch_sync() 调用
IOS 是否有可能因为 worker 长时间运行而暂停主线程(“陷阱”它)?
我可以强制它删除块吗??
我正在添加调试模式堆栈的一些打印屏幕。
在挂起队列之前:
还有挂线:
在暂停和挂起坏队列之后:
【问题讨论】:
-
“pixtr”是您还是第三方产品? .如果是第三方,我会考虑将其从您的 UI 中分离出来,看看是否是问题
-
这里没有什么可做的(特别是,我不知道
add_blob中的内容),所以我最好的就是猜测。我怀疑您将错误的标志传递给cvFloodFill,这会导致它挂起锁定GPU。由于 UIKit 还需要 GPU 来计算滚动(DYTransport 是与 GPU 计算相关的私有框架),这会挂起 UIKit 等待 GPU 可用。