Я программист iOS, который в настоящее время использует Cocos2d-X для создания приложения для Android-iOS.POSIX callback to main thread
Я хотел бы запустить функцию в фоновом потоке (разархивировать файл, занимает 2-3 секунды), а когда он готов, я хотел бы иметь обратный вызов в основном потоке. Во время распаковки есть небольшая анимация загрузчика, которая должна запускаться.
Это был очень простой задачей с НОД:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// Unzipping here.
dispatch_async(dispatch_get_main_queue(),^{
[self callbackWithResult:result]; // Call some method and pass the result back to main thread
});
});
Но здесь я должен использовать POSIX, который является независимым от платформы. Прочтите несколько руководств, но самое лучшее, что я могу сделать, это присоединиться к фоновому потоку в основной поток, когда он будет завершен. Проблема в том, что pthread_join блокирует основной поток, который останавливает мою анимацию загрузки. Это был учебник, который я использовал: https://computing.llnl.gov/tutorials/pthreads/#Joining
(встроенный класс CCHttpRequest использует мьютексы для добавления результатов от фонового потока к потокобезопасному массиву и непрерывного запуска в основном потоке, чтобы проверить, есть ли что-либо в . Потокобезопасная массив Это обходной путь, но я думаю, что это действительно некрасиво для такой простой задачи)
не программист Mac, так Я не понимаю вызовы библиотеки в вашем примере, но это * NEVER * возможно, чтобы один поток вызывал функцию в другом потоке. Темы могут связываться, и один поток может отправлять сообщение другому, запрашивая у получателя вызов функции f(), но получатель должен ожидать сообщение, получать сообщение и добровольно подчиняться ему. –
Спасибо, я думаю, что я буду использовать общий, потокобезопасный контейнерный объект для передачи сообщений. – SPQR3
На самом деле, я пробовал программировать Mac * WAY * давно. Тогда основная функция() программы Mac обычно сидела в цикле, ожидая событий и вызывающих функций по мере необходимости для обработки событий. Тогда не было «других потоков», но если бы это было так, я мог представить себе еще один поток, отправляющий событие «обратного вызова». –