2012-11-20 9 views
23

私は非同期(シリアル)ワーカーキュー内で長時間実行する機能を持っています。 私は、この関数が特定のopenCV呼び出しの中でハングアップすることがあることを知っています。 何らかの理由でこのハングが原因でメインスレッドがハングしてしまいます。 メインスレッドのIOS semaphore_wait_trapがUIでハングアップする

を私はメインスレッド(キュー)に

semaphore_wait_trap() 

への呼び出しがあることがわかり、デバッグモードを一時停止し、入力するとき、私はデバッグモードで吊下げ糸(マイワーカーキュー)を中断し、このことができますトラップが消え、GUIが電話で再び応答します。

ワーカースレッドのポーズ解除後、GUIは1〜2秒間応答します(このスレッドが再度アクティブになるまでは疑わしい)。そしてUIが再び応答しなくなります。このスレッドは、メインスレッドへのdispatch_sync()呼び出しを行いません

/キュー

それはIOSは、労働者が長時間実行であるため(「トラップ」それ)メインスレッドを一時停止することは可能ですか?

ブロックを削除するよう強制できますか?

デバッグモードスタックの印刷画面を追加しています。吊りキューを一時停止する前に

Main Queue Stack

そして、吊下げ糸:

Hanging Queue

と悪いキューを一時停止し、停止後:

After Suspending

+0

あなたやサードパーティ製品は「pixtr」ですか? 。そのサードパーティがあなたのUIからそれを切り離して問題があるかどうかを確認する場合 –

+0

ここではあまり進んでいない(特に、私は 'add_blob'に何が入っているのか分からないので)最高のものは推測です。私の疑念は、間違ったフラグを 'cvFloodFill'に渡しているため、GPUのロックをハングアップさせるということです。 UIKitはまた、スクロールを計算するためにGPUを望んでいるため(DYTransportはGPU計算に関連するプライベートフレームワークです)、UIKitはGPUが使用可能になるのを待ってハングします。 –

答えて

2

ワーカーが長期間実行されているため、IOSがメインスレッドを一時停止(トラップ)する可能性はありますか? - いいえ。 あなたの問題は、UI要素の描画や変更に関連していると思います。バックグラウンドスレッドからすべての関数を呼び出すことはできません(たとえば、UI要素の変更はメインスレッドで行う必要があります)。いずれかの方法は、UI要素を変更する必要がある場合は、あなたのシリアルキューでは、あなたはちょうど私が省略された私として(ディスパッチ関数呼び出しに変数を保持するのを忘れたぶん

dispatch_async(dispatch_get_main_queue(), ^{ 
       //do some main thread job here 
      }); 
) 
+0

私はバックグラウンドワーカースレッドからのUI呼び出しをしません。 –

+0

私はdispatch_queue_create( "worker_queue"、DISPATCH_QUEUE_SERIAL)を行っています。 –

+0

dispatch_async(my_queue、{完了時にコールバック付きワーカーブロック}) –

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; 
} 
関連する問題