#objective-c #boost #interprocess #nsprogressindicator
#цель-c #повышение #межпроцессный #nsprogressindicator
Вопрос:
К сожалению, я не могу размещать здесь проприетарные коды. По сути, это приложение с графическим интерфейсом Mac. Коды не были должным образом разработаны для использования концепции асинхронности. Все обрабатывается в основном потоке, и изменить дизайн за одну ночь невозможно. Поэтому я бы не хотел использовать решение dispatch_async(…).
Контекст проблемы таков: у меня есть трудоемкая задача, которая выполняется в основном потоке. Пока задача обрабатывается, я пытаюсь обновить / перерисовать индикатор выполнения (NSProgressIndicator) на основе процента выполнения задачи (от 0% до 100%). Однако, поскольку задача выполняется в основном потоке, основной поток блокируется, и любое событие обновления / перерисовки в очереди событий должно ждать, пока у основного потока появится возможность просмотреть его, поэтому индикатор выполнения вообще не обновляется / не перерисовывается во время выполнения задачи.
Решение, о котором я думаю, — создать другое приложение (с файлом .exe), которое обрабатывает отображение индикатора выполнения. Из основного приложения я создам другой процесс, и этот процесс выполнит другое приложение. Процент выполнения задачи может быть отправлен из основного приложения в другое приложение с помощью очереди сообщений Boost между процессами.
Я надеюсь услышать как о преимуществах, так и о недостатках этого решения, поэтому любые мысли будут высоко оценены!
Ответ №1:
Вы также можете сделать это из потока в том же процессе. Очереди межпроцессных сообщений все еще работают, хотя достаточно любого потокобезопасного решения.
В общем, может стоить запускать некоторые нетривиальные задачи вне процесса. Изоляция процессов на уровне ядра имеет преимущества, которых у потоков никогда не будет:
- разделение пространства памяти (безопасность)
- разделение привилегий (другой процесс потенциально может выполняться в другом контексте безопасности)
Поэтому при работе с ненадежными входными данными или ненадежным кодом сторонней библиотеки вы можете получить гарантии стабильности для основного процесса.
Однако для ваших целей это звучит как серьезный перебор.
Комментарии:
1. Большое спасибо за ваши мысли, @sehe! Могу я спросить, почему вы считаете это излишеством? Какие недостатки перевешивают преимущества подхода?
2. Запуск процессов является дорогостоящим (может даже подвергаться ограничениям на разрешение), синхронизация и совместное использование данных намного сложнее. Короче говоря, здесь не применяется ни одно из преимуществ безопасности / надежности.
3. Возможно, вы могли бы написать минимальный код для очень простой фоновой задачи как в многопроцессорной, так и в многопоточной версии и посмотреть, какова разница в затратах.
4. Я определенно сделаю это в какой-то момент. Я просто пытаюсь учиться на опыте, чтобы не совершать слишком распространенных ошибок. Еще раз спасибо, @sehe!