Как сделать так, чтобы мой таймер был свободен? - PullRequest
1 голос
/ 20 октября 2019

Это не реальный код, а лишь идея логики в реальном коде. Нужен ли мне Mutex, mylock2, внутри функции таймера? Таймер работает каждые 0,02 секунды. Или таймеры в этом отношении безопасны?

Static NSTimer *mylock1 = nil;  //initialized and used for another purpose
Static NSTimer *mylock2 = nil   //initialized and used for the timer



- (void)timerFireMethod:(NSTimer*)theTimer
{
    [mylock2  lock];
     Self.Mycount = 0;
     for (int j = 0; j <n; j++)
     {
         if (b) NSLog(@”Hi”);
          else Self.Mycount = Self.Mycount + 1;
     }
     If (Self.Mycount == n)
          [self stopMytimer];

    [mylock2  unlock];
}

1 Ответ

1 голос
/ 20 октября 2019

Возможно, вы неправильно понимаете, как работает NSTimer.

NSTimer вызов обрабатывается циклом выполнения, когда таймер запланирован, он подключается к текущему циклу выполнения. Неудивительно, что цикл выполнения является циклом и выполняется в одном потоке. На каждой итерации цикла выполнения выполняется проверка, нужно ли запускать какой-либо таймер, и если это так, то называется , и поэтому следующая операция, которую цикл выполнения будет выполнять, не может произойти, пока этот вызов не вернется ...

таймер использует scheduleTimerWithTimeInterval. если таймер срабатывает каждые 0,02 с, как отменить перекрывающиеся вызовы таймера?

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

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

становится ли "Self.Mycount" 0 в середине выполнения цикла for, вызывая неожиданное поведение?

Возможно - поскольку ваш метод не предназначен для этого сценария. Но если вы не запустите другой поток (используя NSThread, GCD (диспетчеризация) и т. Д.) И не установите для него значение Mycount, равное нулю, этого не произойдет.

HTH

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...