我有一段调用方法(即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
答案 0 :(得分:1)
总之,不,你不能任意杀死另一个线程。没有办法知道它在被杀时会处于什么状态,因此,内存泄漏和/或腐败必然会发生。
您可以通过以下几种方式之一解决此问题(包括合并):
修改regexkit以获得某种“停止”标志,该标志可以在另一个线程中定时器触发后设置。定期检查并在需要时清理/停止。
验证或限制输入正则表达式和输入数据以确保不会发生慢/长情况
分解输入数据,以便批量处理。