2012-11-20 78 views
23

我在異步(串行)工作隊列中有一個很長的運行函數。 我知道有時候這個函數掛在一個特定的openCV調用中。 由於某種原因,此掛起還導致主線程掛起。 當暫停並進入調試模式,我看到有處於調試模式,那麼這個主線程上在主線程上導致在UI中掛起的IOS semaphore_wait_trap

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聲明之前的static關鍵字,並且調度不能使用內聯函數處理)。堆棧跟蹤與您的一樣。那是我的錯。

+ (instancetype)sharedInstance 
{ 
    (static was omitted) dispatch_once_t once; 
    static id sharedInstance; 
    dispatch_once(&once, ^{ 
     sharedInstance = [[self alloc] init]; 
    }); 
    return sharedInstance; 
} 
相關問題