По сообщению источников из Генпрокуратуры, против корпорации Майкрософт возбуждено уголовное дело по статье "Создание, использование и распространение вредоносных программ для ЭВМ".
...
uses syncobjs;
...
var
CheckEvent: TEvent;
...
procedure TForm1.FormCreate(Sender: TObject);
begin
CheckEvent := TEvent.Create(nil, false, true, 'MYPROGRAM_CHECKEXIST');
if CheckEvent.WaitFor(10) <> wrSignaled thenbegin// Сюда попадаем если одна копия уже запущена.// Можно, например, сообщить об этом пользователю.
Self.Close; // Здесь можно завершить программу или сделать еще что-нибудь.end;
end;
Бессконечная погоня за сингулярностью!
Чтобы предотвратить запуск второй копии программы, вы используете умелый подход: создание объекта события (TEvent) и ожидание его сигнализации, если уже существует другая инстанция.
Вот разбивка того, что это код делает:
В методе FormCreate создается объект события CheckEvent с уникальным именем 'MYPROGRAM_CHECKEXIST'.
Метод WaitFor вызывается на объекте события, который ожидает 10 секунд (вы можете изменить это время по своему вкусу) для другой инстанции программы создать и сигнализировать событие.
Если событие не сигнализируется в течение этого времени (wrSignaled), то это означает, что нет другой инстанции, работающей, и код выполняется нормально.
Однако, если есть другая инстанция, она будет сигнализировать событие, вызывая немедленное закрытие этой инстанции с помощью Self.Close.
Хотя этот подход эффективен, есть несколько вещей для рассмотрения:
Время ожидания: Если создание объекта события занимает дольше 10 секунд (например, из-за сетевой задержки), инстанция может не обнаружить другую работающую инстанцию.
Конкурентный доступ: Множество инстанций, пытаясь создать и сигнализировать событие одновременно, может привести к неожиданному поведению. Для уменьшения этого риска вы можете использовать более robust механизм синхронизации,such as файловая блокировка или регистрация ключа.
Платформо-специфические соображения: Этот код написан на Delphi (используя TEvent), что может не быть совместимым с всеми платформами и архитектурами.
Альтернативный подход мог бы заключаться в комбинации следующих шагов:
Создайте уникальный файл или регистрационный ключ для каждой работающей инстанции, и проверьте, существует ли он перед запуском.
Используйте платформо-специфические механизмы блокировки, такие как futex на Linux или mutex на Windows.
Реализуйте более robust механизм синхронизации,like distributed lock service.
Помните, что вам нужно учитывать конкретные требования вашей приложения и платформы, которую вы планируете запускать, выбирая подход к предотвращению запуска нескольких инстанций одновременно.
В статье описывается способ предотвращения запуска второй копии программы на языке Pascal с помощью использования синхронизированных объектов (syncobjs) и определения события проверки существования процесса.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.