28

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

semaphore_wait_trap()

在主线程(队列)上

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

取消暂停工作线程后,GUI 会响应 1-2 秒(我怀疑直到再次激活该线程),然后 UI 再次变得无响应。

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

IOS是否有可能因为工作人员长时间运行而暂停主线程(“陷阱”它)?

我可以强制它删除块吗?

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

在暂停挂起队列之前:

主队列栈

和挂线:

挂队

并在暂停和挂起坏队列后:

暂停后

4

2 回答 2

2

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

dispatch_async(dispatch_get_main_queue(), ^{
                //do some main thread job here
            });
)
于 2012-11-20T13:32:20.777 回答
0

也许您只是忘记在调度函数调用中保留一个变量(对我而言,我在 dispatch_once_t 声明之前省略了一个静态关键字,并且调度无法使用内联函数处理)。堆栈跟踪就像你的一样。那是我的错。

+ (instancetype)sharedInstance
{
    (static was omitted) dispatch_once_t once;
    static id sharedInstance;
    dispatch_once(&once, ^{
        sharedInstance = [[self alloc] init];
    });
    return sharedInstance;
} 
于 2014-05-06T17:38:32.760 回答