2011-02-12 11 views
0

我有一段代碼調用了一個來自第三方庫regexKitLite的方法(即processRegex),它在一堆數據上運行正則表達式匹配。我正在使用performSelectorInBackground:在bg線程中運行此方法。我發現在某些情況下,如果數據無效或損壞,那麼processRegex方法會鎖定線程並陷入遞歸循環,這可能需要永遠回來,我想obv想避免。是否有可能使用定時器殺死後臺線程中的流氓方法?

我正在考慮使用基本上等待x時間的計時器,並且如果它在指定的時間過去之前沒有失效,則殺死正在運行該方法的bg線程。然而

我的問題是:

我不能啓動計時器在同一個線程的正則表達式的方法,因爲線程可以鎖定在試圖處理數據並難道不叫我的計時器,因爲我下面嘗試過。

// setup timer to restrict the amount of time a regex can take before killing it 
myTimer = [NSTimer scheduledTimerWithTimeInterval:10.0 target:self selector:@selector(resultProcessingTimedOut:) userInfo:nil repeats:NO]; 

resultsArray = [NSMutableArray arrayWithArray:[html arrayOfCaptureComponentsMatchedByRegex:]; // <-- could lock up thread!! 

[myTimer invalidate]; 

其次,根據你要無效在同一個線程計時器蘋果文檔啓動它,我不能在自己的後臺線程啓動計時器,因爲IM不知道我怎麼會那麼無效呢?

最後,我怎麼會殺死正在運行正則表達式的線程,因爲你不應該終止線程。

關於如何處理這種情況的任何想法?

thx

回答

1

總之,不能,你不能任意殺死另一個線程。沒有辦法知道死亡時會出現什麼狀態,因此內存泄漏和/或損壞必然會發生。

您可以通過多種方式(包括組合),一個解決這個問題:

  • 修改regexkit有某種「停止」,可以在另一個線程定時器觸發後設置標誌。定期檢查並在需要時清理/停止。

  • 驗證或限制輸入正則表達式和輸入數據,以確保快/慢長的局面不會發生

  • 分手,這樣你可以批量處理它的輸入數據。

相關問題