Можно ли использовать таймер для уничтожения мошеннического метода в фоновом потоке? - PullRequest
0 голосов
/ 12 февраля 2011

У меня есть фрагмент кода, который вызывает метод (то есть processRegex) из сторонней библиотеки regexKitLite, которая выполняет сопоставление регулярных выражений для группы данных. Я запускаю этот метод в потоке bg, используя executeSelectorInBackground :. Я обнаружил, что в некоторых случаях, если данные недействительны или повреждены, метод processRegex блокирует поток и попадает в рекурсивный цикл, который может длиться вечно, чего я хотел бы избежать.

Я думал об использовании таймера, который в основном ожидает x количество времени, и если он не был аннулирован до истечения указанного времени, то убивает поток bg, выполняющий метод.

Однако моя проблема:

Я не могу запустить таймер в том же потоке, что и метод regex, потому что этот поток может заблокироваться при попытке обработать данные и не будет вызывать мой таймер, как я пытался ниже.

// 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];

Во-вторых, согласно Apple Docs, вы должны сделать недействительным таймер в том же потоке, который его запустил, и я не могу запустить таймер в его собственном фоновом потоке, потому что я не уверен, как бы я затем его аннулировал?

И, наконец, как бы мне даже уничтожить поток, в котором выполняется регулярное выражение, поскольку вы не должны прерывать потоки.

Любые идеи о том, как справиться с этой ситуацией ???

ТНХ

1 Ответ

1 голос
/ 12 февраля 2011

Короче говоря, нет, вы не можете произвольно уничтожить другой поток.Нет никакого способа узнать, в каком состоянии он будет, когда будет уничтожен, и, таким образом, утечки памяти и / или повреждение могут произойти.

Вы можете решить это одним из нескольких способов (включая объединение):

  • изменить регулярное выражение, чтобы иметь какой-то флаг "остановки", который можно установить после запуска таймера в другом потоке.Периодически проверяйте его и при необходимости очищайте / останавливайте.

  • проверяет или ограничивает входное регулярное выражение и входные данные, чтобы убедиться, что ситуация медленного / длинного не возникает

  • разбить входные данные так, чтобы вы могли обрабатывать их в пакетном режиме.

...