EDIT: Сегодня я немного работал с моим кодом и дал фоновой задаче несколько преимуществ по сравнению с основной задачей потока. По сути, один поток работает с четными номерами в массиве, а другой работает с нечетными числами. Я дал фоновому потоку четное число, равное или меньшее, чем нечетная половина. Кроме того, я переместил while(!collisionDone)
немного позже в код, насколько я могу сохранить его в потоковом режиме. Я положил NSLog
туда, чтобы определить, является ли условие когда-либо ложным, когда оно достигает этой точки, и оно не срабатывало один раз. Кроме того, теперь сборка инструментов прекрасна. Это означает, что проблема заключается в остановке основного потока с циклом while. Так что теперь мой вопрос:Инструменты блоки Background Thread?
Как мне остановить главный поток, чтобы ждать, пока фоновый поток выполнит задачу? Возможно, продемонстрируйте, как один использует NSLock
для достижения этой функциональности?
Сегодня я добавил многопоточность, пытаясь уменьшить отставание в моей игре. Я использую NSTimer называть мое время функции цикла, как это:
[NSTimer scheduledTimerWithTimeInterval:0.03 target:self selector:@selector(time:) userInfo: nil repeats: true];
Тогда, в этой функции, у меня есть:
//run collision using multithreading
collisionDone = false;
[self performSelectorInBackground:@selector(collideBackground:) withObject:objectToSend];
[self collideMain:objectToSend];
while (!collisionDone) {
//notdone
}
Идея заключается в том, что я бегу один набор проверок столкновений на один поток и другой набор в другом потоке. Пустой цикл while должен убедиться, что фоновый поток завершен до начала функции. После этого бита, код продолжает обновлять представление.
Все это нормально работает, но когда я пошел в Инструменты, чтобы проверить мой FPS, я обнаружил, что игра зависает, кажется, что она замерзает где-то в первом прогоне цикла времени. Приложение отлично работало в Инструментах до многопоточности, которое по существу работало одинаково, за исключением простого использования [self collideBackground:objectToSend]
, а не отправки его в другой поток. Похоже, что фоновый поток не выполняется или вообще не запускается, поэтому collisionDone всегда будет ложным, поэтому приложение будет ждать в этом бесконечном цикле, пока я его не убью.
Кроме того, я попытался заменить эту линию на [self collideBackground:arrayToSend];
, и она снова начинает работать. Еще одна вещь, которую я пробовал, это положить NSLog(@"called");
в самом начале viewWillAppear:
, и, похоже, он запускает ровно еще один кадр!?!?!?
Мне нравятся идеи относительно того, почему именно это происходит и как это исправить. Я сомневаюсь, что он не связан с многопоточным процессом, так как все в одном потоке исправляет его.
вы можете присоединиться к вашей теме, вместо того, чтобы делать активное ожидание, проверьте [этот ответ из] (HTTP: // StackOverflow .com/questions/3614780/how-to-join-threads-in-object-c-without-use-delegates-callback), вероятно, не исправить вашу проблему, но лучше всего подходит для потоковой передачи – Fonix
Спасибо за совет, но я не совсем уверен, как я должен использовать NSLock или любой из его подклассов, чтобы основной поток ожидал завершения фонового потока. Я понимаю, что цикл while - это не самый эффективный способ ожидания. В любом случае, начиная с последнего изменения моего кода, условие будет ложным только тогда, когда оно попадает в цикл while в редких случаях (см. Мое редактирование). – WolfLink
использовать большой метод отправки в этом ответе, гораздо проще реализовать/понять. – Fonix