Как я вижу, вам нужно либо приостановить поток, либо убить его.
Если вы убьете его, вам нужно убедиться, что все ресурсы освобождены, что означает повторный вызов openGL, скорее всего.В этом случае может быть лучше просто дождаться окончания выполнения блока.Это означает, что блок не должен занимать слишком много времени для завершения, что невозможно гарантировать, и, поскольку у вас несколько контекстов и потоков, это может реально представлять проблему.
Так что приостановка кажется лучше.Я не уверен, есть ли прямой API для приостановки потока, но вы можете заставить его ждать.Возможно, в качестве системы, аналогичной , эта может помочь.
Кажется, что связанный пример обрабатывает именно то, что вы хотели бы;он уже проверяет текущий поток и блокирует его.Я полагаю, вы могли бы упаковать это в какой-то инструмент в виде статического метода или функции C, и там, где вы уверены, что вы можете приостановить поток, вы просто сделаете что-то вроде:
dispatch_sync(glProcessingQueue, ^{
[EAGLContext setCurrentContext:_eaglContext];
[ThreadManager pauseCurrentThreadIfNeeded];
glViewPort(...)
glBindFramebuffer(...)
[ThreadManager pauseCurrentThreadIfNeeded];
glClear(...)
glDrawArrays(...)
glReadPixels(...) // read in renderedData
[ThreadManager pauseCurrentThreadIfNeeded];
}
У вас все еще может быть проблема сосновной поток, если он используется.Возможно, вы захотите пропустить паузу в этом случае, иначе ваша система может просто никогда больше не проснуться (хотя не уверен, попробуйте).
Итак, теперь вы смотрите на интерфейс вашего ThreadManager
как что-то вроде:
+ (void)pause {
__threadsPaused = YES;
}
+ (void)resume {
__threadsPaused = NO;
}
+ (void)pauseCurrentThreadIfNeeded {
if(__threadsPaused) {
// TODO: insert code for locking until __threadsPaused becomes false
}
}
Дайте нам знать, что вы узнали.