Вызов кросс-потока a.k.a запускается в потоке main / UI из другого потока без необходимости в зависимостях

Я работаю на каком-то мобильном продукте c ++, но мне нужно, чтобы основной поток моих приложений по-прежнему работал без каких-либо блокировок при выполнении какой-либо тяжелой работы в фоновом потоке и повторном запуске в основном потоке. Но я понял, что в API-интерфейсе потока c ++ нет runOnMainThread / runOnUIThread. Я попытался разобраться в проблеме и обнаружил, что нужно зависеть от библиотеки или создать собственную очередь событий потока. Хотя это хорошо, но я думаю, чтобы иметь поведение, которое может запускать ONUIThread.

0

Решение

Как это не работает: упомянутая библиотека создает таймер, устанавливает SIGALRM обработчик сигналов и отправляет поставленные в очередь задачи при срабатывании сигналов. Это позволяет обрабатывать задачи в главном потоке, даже когда он занят. тем не мение POSIX допускает только небольшой набор функций, безопасных для асинхронных сигналов быть вызванным внутри обработчика сигнала. Запуск произвольного кода С ++ внутри обработчика сигнала нарушает это ограничение и оставляет приложение в безнадежно обреченном состоянии.

0

Другие решения

После некоторых исследований и разработок я создал библиотеку под названием NonBlockpp

Это небольшая библиотека c ++, позволяющая мобильному приложению c ++ обрабатывать тяжелые и трудоемкие задачи в фоновом режиме и снова возвращаться в главный поток. Она была протестирована и вызвала событие основного потока.

Это также позволяет сохранять задачи и запускать их позже, все задачи не блокируют друг друга и не обеспечивают безопасность потоков.

Как это устроено:
введите описание изображения здесь

введите описание изображения здесь
введите описание изображения здесь

Если вы нашли какой-либо вопрос или предложение, пожалуйста, не стесняйтесь поднимать вопрос, и мы можем обсудить его вместе.

0

Проект выпрямился из сигнала в pollEvent, так как обработчик сигнала может быть небезопасным в использовании.

Пожалуйста, посмотрите, что изменилось.

NonBlockpp

использование

0