Проблемы с запуском нескольких экземпляров приложения? - PullRequest
2 голосов
/ 31 января 2012

У меня есть клиентское приложение (C ++, Windows), которое открывает сокеты, подключается к серверу, делает запросы, получает ответы и уведомления.Это делает регистрацию и сохраняет настройки локально.Какие могут быть проблемы, если я пытаюсь запустить несколько экземпляров этого приложения, что в настоящее время запрещено?

Ответы [ 4 ]

3 голосов
/ 31 января 2012

У вас есть особая проблема, которую вы видите?то есть - происходит ли сбой приложения при запуске второго экземпляра?

Из вашего описания вы не сможете открыть исполняемый файл, если второе приложение

  • Пытается открыть тот же сокетпервое открытие
  • Пытается открыть тот же файл, что первое открытие

Вне этого требуется более подробная информация.

2 голосов
/ 31 января 2012

Звучит как веб-браузер;)

И, как в обычном веб-браузере, , если ваше приложение реализовано правильно, вы сможете нормально запускать несколько экземпляров.

К сожалению, есть способы запустить реализацию, например:

  • Исключительно блокируйте файлы журнала или конфигурации на длительные периоды, тем самым "останавливая" другие экземпляры.
  • Просто игнорируйте одновременный доступ к файлам, что приводит ко всевозможным повреждениям.
  • Действуйте не только как клиент, но и как сервер, а также слушайте жестко запрограммированный порт (так что второй экземпляр завершится неудачно при попытке открыть тот же порт).
  • Неправильное объявление мьютекса как «открытого» (и, следовательно, общего для процессов) вместо «частного», что приводит к замедлению и, возможно, взаимным блокировкам.
  • Существует ограничение для числа дескрипторов GDI за сеанс . Если ваше приложение использует слишком много дескрипторов, то несколько экземпляров, взятых вместе, могут достичь этого предела, даже если каждый из них в отдельности соблюдает ограничение в 10000 дескрипторов на процесс.
  • Быть процессором (например, до в ожидании ). Одна загрузка ЦП на современном многоядерном процессоре может остаться незамеченной, но как только количество экземпляров превысит количество ядер ЦП, это уже другая история!
  • Будь боровом памяти.
  • Неправильный пользовательский интерфейс:
    • Используйте хитрости пользовательского интерфейса, такие как «всегда сверху» - несколько таких окон на экране одновременно неинтересны!
    • Неправильное управление областью уведомлений панели задач (например, отображение иконки в трее для каждого экземпляра). Технически «работать», но чрезмерное количество значков в трее неприятно, особенно если в приложении также нет «обычной» кнопки панели задач.

и т. Д. И т. Д. По существу, когда есть общий ресурс (будь то файловая система, сеть, процессор, память, экран или что-то еще), при одновременном его использовании необходимо соблюдать осторожность.

2 голосов
/ 31 января 2012

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

Если все экземпляры совместно используют один и тот же файл журнала и / или файл конфигурации, параллельная записьможет повредить эти файлы, поэтому операции записи должны быть защищены каким-либо объектом синхронизации (например, мьютексом).

1 голос
/ 31 января 2012

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

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

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

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

...