Предотвращение запуска второго экземпляра, кроме как в конкретном случае - PullRequest
1 голос
/ 28 декабря 2008

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

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

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

Как это можно сделать?

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

            string proc = Process.GetCurrentProcess().ProcessName;

            Process[] processess = Process.GetProcessesByName(proc);
            if (processess.Length > 1) {
                MessageBox.Show("There is an instance of the Timer already running");
                return;
            }

Ответы [ 3 ]

2 голосов
/ 28 декабря 2008

Ситуация, которая усложняет это, заключается в том, что при определенных условиях вы хотите, чтобы второй вызов программы что-то делал, если запущен другой. Использование именованного мьютекса позволит вам определить, запущена ли уже программа - она ​​должна уже содержать мьютекс. Вам все еще понадобится способ связи с ним, чтобы заставить работающую программу что-то делать, когда запускается вторая. Скорее всего, сработает асинхронная очередь сообщений, вам просто нужно периодически запускать проверяемую программу, чтобы увидеть, ожидают ли новые сообщения. Сообщение должно сказать программе, как изменить. Посмотрите на пространство имен System.Threading (так как похоже, что вы уже используете .Net), в частности классы мьютекса и семафора, и System.Messaging.MessageQueue для обмена сообщениями .

Основная идея:

  program start
  try to acquire mutex (or semaphore)
  if failed
     send message via message queue to running program
     exit
  else

  set up listener for message queue

  run rest of program

Слушатель может принимать форму таймера, который периодически истекает с обратным вызовом по истечении срока, проверяющим сообщения в очереди и соответствующим образом обновляющим действия программы. Таймер должен был бы быть сброшен автоматически, чтобы вернуться к прослушиванию. Вашей программе потребуется возможность восстановления после прерывания таймером и «перезапуска» на основе обновленной конфигурации.

1 голос
/ 28 декабря 2008

Для этого вы можете использовать общий (именованный) мьютекс.

См. документацию Win32 API для объектов Mutex (я предполагаю, что в C # для этого есть языковые привязки).

0 голосов
/ 28 декабря 2008

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

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

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