28

非同期 (シリアル) ワーカー キュー内に実行時間の長い関数があります。この関数は、特定の openCV 呼び出し内でハングすることがあります。何らかの理由で、このハングが原因でメイン スレッドもハングします。一時停止してデバッグモードに入ると、への呼び出しがあることがわかります

semaphore_wait_trap()

メインスレッド (キュー)

ハングしているスレッド (My worker キュー) をデバッグ モードで一時停止すると、このトラップがなくなり、電話で 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 に答える