Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Как не допустить запуск второй копии программы 3

Delphi , Программа и Интерфейс , Приложение своё

Как не допустить запуск второй копии программы 3

Автор: Владимир Волосенков

По сообщению источников из Генпрокуратуры, против корпорации Майкрософт возбуждено уголовное дело по статье "Создание, использование и распространение вредоносных программ для ЭВМ".


...
uses syncobjs;
...
var
  CheckEvent: TEvent;

...

procedure TForm1.FormCreate(Sender: TObject);
begin
  CheckEvent := TEvent.Create(nil, false, true, 'MYPROGRAM_CHECKEXIST');
  if CheckEvent.WaitFor(10) <> wrSignaled then
  begin
    // Сюда попадаем если одна копия уже запущена.
    // Можно, например, сообщить об этом пользователю.
    Self.Close; // Здесь можно завершить программу или сделать еще что-нибудь.
  end;
end;

Бессконечная погоня за сингулярностью!

Чтобы предотвратить запуск второй копии программы, вы используете умелый подход: создание объекта события (TEvent) и ожидание его сигнализации, если уже существует другая инстанция.

Вот разбивка того, что это код делает:

  1. В методе FormCreate создается объект события CheckEvent с уникальным именем 'MYPROGRAM_CHECKEXIST'.
  2. Метод WaitFor вызывается на объекте события, который ожидает 10 секунд (вы можете изменить это время по своему вкусу) для другой инстанции программы создать и сигнализировать событие.
  3. Если событие не сигнализируется в течение этого времени (wrSignaled), то это означает, что нет другой инстанции, работающей, и код выполняется нормально.
  4. Однако, если есть другая инстанция, она будет сигнализировать событие, вызывая немедленное закрытие этой инстанции с помощью Self.Close.

Хотя этот подход эффективен, есть несколько вещей для рассмотрения:

  • Время ожидания: Если создание объекта события занимает дольше 10 секунд (например, из-за сетевой задержки), инстанция может не обнаружить другую работающую инстанцию.
  • Конкурентный доступ: Множество инстанций, пытаясь создать и сигнализировать событие одновременно, может привести к неожиданному поведению. Для уменьшения этого риска вы можете использовать более robust механизм синхронизации,such as файловая блокировка или регистрация ключа.
  • Платформо-специфические соображения: Этот код написан на Delphi (используя TEvent), что может не быть совместимым с всеми платформами и архитектурами.

Альтернативный подход мог бы заключаться в комбинации следующих шагов:

  1. Создайте уникальный файл или регистрационный ключ для каждой работающей инстанции, и проверьте, существует ли он перед запуском.
  2. Используйте платформо-специфические механизмы блокировки, такие как futex на Linux или mutex на Windows.
  3. Реализуйте более robust механизм синхронизации,like distributed lock service.

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

В статье описывается способ предотвращения запуска второй копии программы на языке Pascal с помощью использования синхронизированных объектов (syncobjs) и определения события проверки существования процесса.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




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


:: Главная :: Приложение своё ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-19 13:29:56
2024-11-21 11:40:07/0.005620002746582/1