0

Я программист 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 использует мьютексы для добавления результатов от фонового потока к потокобезопасному массиву и непрерывного запуска в основном потоке, чтобы проверить, есть ли что-либо в . Потокобезопасная массив Это обходной путь, но я думаю, что это действительно некрасиво для такой простой задачи)

+1

не программист Mac, так Я не понимаю вызовы библиотеки в вашем примере, но это * NEVER * возможно, чтобы один поток вызывал функцию в другом потоке. Темы могут связываться, и один поток может отправлять сообщение другому, запрашивая у получателя вызов функции f(), но получатель должен ожидать сообщение, получать сообщение и добровольно подчиняться ему. –

+0

Спасибо, я думаю, что я буду использовать общий, потокобезопасный контейнерный объект для передачи сообщений. – SPQR3

+0

На самом деле, я пробовал программировать Mac * WAY * давно. Тогда основная функция() программы Mac обычно сидела в цикле, ожидая событий и вызывающих функций по мере необходимости для обработки событий. Тогда не было «других потоков», но если бы это было так, я мог представить себе еще один поток, отправляющий событие «обратного вызова». –

ответ

0

Используется для запуска кода в главном потоке cocos2d:.

Director::getInstance()->getScheduler()->performFunctionInCocosThread([]{ 
    // execution in main thread 
});