Является ли хорошей идеей создание другого процесса для части пользовательского интерфейса?

#objective-c #boost #interprocess #nsprogressindicator

#цель-c #повышение #межпроцессный #nsprogressindicator

Вопрос:

К сожалению, я не могу размещать здесь проприетарные коды. По сути, это приложение с графическим интерфейсом Mac. Коды не были должным образом разработаны для использования концепции асинхронности. Все обрабатывается в основном потоке, и изменить дизайн за одну ночь невозможно. Поэтому я бы не хотел использовать решение dispatch_async(…).

Контекст проблемы таков: у меня есть трудоемкая задача, которая выполняется в основном потоке. Пока задача обрабатывается, я пытаюсь обновить / перерисовать индикатор выполнения (NSProgressIndicator) на основе процента выполнения задачи (от 0% до 100%). Однако, поскольку задача выполняется в основном потоке, основной поток блокируется, и любое событие обновления / перерисовки в очереди событий должно ждать, пока у основного потока появится возможность просмотреть его, поэтому индикатор выполнения вообще не обновляется / не перерисовывается во время выполнения задачи.

Решение, о котором я думаю, — создать другое приложение (с файлом .exe), которое обрабатывает отображение индикатора выполнения. Из основного приложения я создам другой процесс, и этот процесс выполнит другое приложение. Процент выполнения задачи может быть отправлен из основного приложения в другое приложение с помощью очереди сообщений Boost между процессами.

Я надеюсь услышать как о преимуществах, так и о недостатках этого решения, поэтому любые мысли будут высоко оценены!

Ответ №1:

Вы также можете сделать это из потока в том же процессе. Очереди межпроцессных сообщений все еще работают, хотя достаточно любого потокобезопасного решения.

В общем, может стоить запускать некоторые нетривиальные задачи вне процесса. Изоляция процессов на уровне ядра имеет преимущества, которых у потоков никогда не будет:

  • разделение пространства памяти (безопасность)
  • разделение привилегий (другой процесс потенциально может выполняться в другом контексте безопасности)

Поэтому при работе с ненадежными входными данными или ненадежным кодом сторонней библиотеки вы можете получить гарантии стабильности для основного процесса.

Однако для ваших целей это звучит как серьезный перебор.

Комментарии:

1. Большое спасибо за ваши мысли, @sehe! Могу я спросить, почему вы считаете это излишеством? Какие недостатки перевешивают преимущества подхода?

2. Запуск процессов является дорогостоящим (может даже подвергаться ограничениям на разрешение), синхронизация и совместное использование данных намного сложнее. Короче говоря, здесь не применяется ни одно из преимуществ безопасности / надежности.

3. Возможно, вы могли бы написать минимальный код для очень простой фоновой задачи как в многопроцессорной, так и в многопоточной версии и посмотреть, какова разница в затратах.

4. Я определенно сделаю это в какой-то момент. Я просто пытаюсь учиться на опыте, чтобы не совершать слишком распространенных ошибок. Еще раз спасибо, @sehe!