Потоки iOS ждут действий - PullRequest
4 голосов
/ 12 мая 2011

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

Когда буфер заполняется, я в настоящее время говорю потоку ждать:

while( [self FreeWriteSpace] < mProcessBufferSize && InActive) {
    [NSThread sleepForTimeInterval:.0001];
}

Однако, когда я профилирую, я получаю многопроцессорного времени, проведенного во сне.Есть ли лучший способ подождать?Меня вообще волнует, если в профилях написано, что время проведено во сне?

Ответы [ 2 ]

8 голосов
/ 12 мая 2011

Время, проведенное во сне, эффективно бесплатно. В инструментах посмотрите на «бегущие сэмплы», а не на «все сэмплы». Но это все еще не идеальное решение.

Во-первых, ваш интервал сна сумасшедший. Вы действительно нуждаетесь в зернистости. 1 мкс? Система почти наверняка не дает вам, потому что процессор не такой быстрый. Я должен верить, что ты мог довести это до 0,1 или 0,01. Но это все еще напряженное ожидание, которое не идеально, если вы можете помочь ему.

Лучшее решение - использовать NSCondition. В этом потоке дождитесь условия, а в потоке обработки запустите условие, когда есть место для записи.

Будьте осторожны с именами. Не называйте методы с начальными заглавными буквами (это указывает на то, что это имя класса). И избегайте прямого доступа к ivars (InActive), как это. «InActive» также очень запутанное имя. Означает ли это, что система активна (In Active) или не активна (неактивна). Называние в Objective-C чрезвычайно важно. Компилятор не защитит вас так, как в C # и C ++. Хорошее наименование - это то, как вы поддерживаете свои программы, и многие части ObjC полагаются на это.

Возможно, вы также захотите изучить Grand Central Dispatch, которая специально разработана для такого рода проблем. Посмотрите на dispatch_async(), чтобы запустить все, когда поступят новые данные.

2 голосов
/ 12 мая 2011

Однако, когда я регистрирую, я получаю много процессорного времени, проводимого во сне.Есть ли лучший способ подождать?Меня вообще волнует, если в профилях написано, что время проводится во сне?

Да - никогда, никогда не опрашиваю.Опрос потребляет процессор, делает ваше приложение менее отзывчивым, расходует заряд аккумулятора и тратит много времени.

Вместо этого вместо уведомлений.

Самый простой способ - использовать один из вариантов «выполнить селектор наосновной поток »(см. документацию NSThread).Или отправить в очередь (включая что-то вроде dispatch_async(dispatch_get_main_queue(), ^{ ... yo, data be ready ...});).

...