是否有可能使用计时器来杀死后台线程中的流氓方法?

时间:2011-02-12 19:37:49

标签: iphone objective-c regex multithreading nsthread

我有一段调用方法(即processRegex)的代码,该方法来自第三方库regexKitLite,它在一堆数据上运行正则表达式匹配。我正在使用performSelectorInBackground:在bg线程中运行此方法。我发现在某些情况下,如果数据无效或已损坏,那么processRegex方法会锁定线程并在一个递归循环中被捕获,这可能需要永远回来,我想要避免。

我正在考虑使用一个基本上等待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];

其次,根据苹果文档,你必须在启动它的同一个线程中使计时器无效,我不能在它自己的后台线程中启动计时器,因为我不确定我将如何使它无效?

最后,我怎么会杀死正在运行正则表达式的线程,因为你不应该终止线程。

关于如何处理这种情况的任何想法???

THX

1 个答案:

答案 0 :(得分:1)

总之,不,你不能任意杀死另一个线程。没有办法知道它在被杀时会处于什么状态,因此,内存泄漏和/或腐败必然会发生。

您可以通过以下几种方式之一解决此问题(包括合并):

  • 修改regexkit以获得某种“停止”标志,该标志可以在另一个线程中定时器触发后设置。定期检查并在需要时清理/停止。

  • 验证或限制输入正则表达式和输入数据以确保不会发生慢/长情况

  • 分解输入数据,以便批量处理。