Как я могу остановить фоновый поток из основного потока в Iphone NSthread? - PullRequest
1 голос
/ 15 января 2010

Я запускаю фоновый поток из моей программы, пока мой основной поток что-то проверяет. Если проверка ложна, я хочу остановить запущенный фоновый поток и начать все заново с моими новыми параметрами.

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

Ответы [ 2 ]

2 голосов
/ 15 января 2010

По моему опыту, обычно лучше всего, чтобы поток выходил изящно сам по себе. Как насчет наличия некоторой общей переменной, которую основной поток может установить в false, если что-то пойдет не так. Второй поток может периодически проверять эту переменную, и если для нее установлено значение false, он знает, что ее следует очистить и вернуть.

Я думаю, что вы могли бы использовать условные переменные более элегантным способом, но его подход с правильным использованием NSLock должен работать.

1 голос
/ 15 января 2010

NSThread реализует метод -(void)cancel, который устанавливает информацию о состоянии в принимающем потоке, чтобы указать, что он должен завершиться. Получающий фоновый поток должен - при правильном поведении - регулярно проверять, отменен ли он, используя -(BOOL)isCancelled.

Таким образом, у получателя есть возможность правильно очистить полученные ресурсы.

Если посмотреть на семантическую нить языка Java, этот аппарат работает точно так же. Javas Thread реализует два метода void Thread.interrupt() и boolean Thread.isInterrupted().

В случае, если длительные фоновые операции не реагируют на попытку -cancel их, я бы посчитал это серьезной проблемой и подал бы отчет об ошибке / запрос на изменение.

Вы можете дождаться завершения фонового потока, регулярно вызывая либо -(BOOL)isFinished, либо -(BOOL)isExecuting на фоне NSThread. К сожалению, NSDidBecomeSingleThreadedNotification не поддерживается на платформе iPhone.

...