Количество параллельных экземпляров моего процесса (приложение) - PullRequest
3 голосов
/ 29 сентября 2011

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

У меня есть приложение на c ++ (win32), где мне нужно знать, как часто оно запускалось. Проблема в что несколько пользователей могут запустить его параллельно (терминальный сервер), поэтому я не могу найти список «запущенных процессов», потому что не могу получить доступ к списку других пользователей.

Я пробовал это с Семафором (boost & win32 CreateSemaphore) Это сработало, но теперь у меня есть проблема, если приложение падает (утверждение или просто убить процесс), счетчик не изменяется. (перезагрузка помогает)

Также ручное удаление / сброс счетчика семафоров в моем коде невозможно, потому что я не знаю, запускает ли мое приложение кто-то еще.

Ответы [ 3 ]

2 голосов
/ 29 сентября 2011

Отредактировано, чтобы добавить:

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

Оригинальный ответ:

Полагаю, вы хотите убедиться, что одновременно запускается только одна копия вашего процесса. (Или, для Terminal Server, одна копия вашего процесса за сеанс входа в систему).

Ваше именованное решение семафора близко. Правильный способ сделать это - именованный мьютекс. Используйте CreateMutex для создания мьютекса, затем вызовите WaitForSingleObject с таймаутом, равным нулю. Если WaitForSingleObject возвращает WAIT_TIMEOUT, выполняется другая копия процесса. Если он возвращает WAIT_OBJECT_0 или WAIT_ABANDONED, то вы - единственная копия процесса. Вам нужно держать дескриптор мьютекса открытым во время работы вашей программы - либо вызовите CloseHandle , когда ваш процесс собирается завершиться, либо просто намеренно утечка дескриптора и полагайтесь на встроенную очистку Windows, чтобы освободить дескриптор для вас. когда ваш процесс завершается. Windows автоматически увеличит счетчик мьютекса при выходе из вашего процесса.

1 голос
/ 29 сентября 2011

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

1 голос
/ 29 сентября 2011

Единственное, что я могу придумать, чтобы смягчить проблему аварийных процессов, это своего рода «переключатель мертвецов» : каждый процесс должен регулярно обновлять свое состояние.Если процесс не может это сделать, он автоматически удаляется из списка активных процессов.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...