主线程上的IOS semaphore_wait_trap导致UI挂起

Avn*_*arr 24 semaphore hang ios

我在异步(串行)工作队列中有一个长时间运行的函数.我知道有时这个函数会在特定的openCV调用中挂起.由于某种原因,这个挂起也导致主线程挂起.暂停并进入调试模式时,我看到有一个调用

semaphore_wait_trap()
Run Code Online (Sandbox Code Playgroud)

在主线程(队列)上

我可以在调试模式下挂起挂起的线程(我的工作队列)然后这个陷阱消失,GUI再次在手机上响应.

在取消暂停工作线程后,GUI响应1-2秒(我怀疑再次激活此线程)然后UI再次无响应.

该线程不dispatch_sync()调用主线程/队列

IOS是否可能暂停主线程("陷阱")因为工作者长时间运行?

我可以强制它去掉块吗?

我正在添加调试模式堆栈的一些打印屏幕.

暂停挂起队列之前:

主队列堆栈

和挂线:

挂队

暂停和暂停坏队列后:

暂停后

Fah*_*mov 2

IOS 是否有可能因为工作线程长时间运行而暂停主线程(“捕获”它)?- 不。我认为,您的问题与绘制或更改某些 UI 元素有关。并非所有函数都可以从后台线程调用(例如,UI 元素的更改必须在主线程中完成)。在串行队列中,如果任何方法需要更改 UI 元素,则必须在主线程上调用它,例如

dispatch_async(dispatch_get_main_queue(), ^{
                //do some main thread job here
            });
)
Run Code Online (Sandbox Code Playgroud)

  • 我和你一样使用了 OpenCV,并且遇到了和你一样的问题。就我而言,问题是我在后台线程上使用 Core Graphics 函数。您必须提供调度块代码以及您在块中调用的方法的代码,以便我们可以帮助您。 (5认同)