Как сделать исключение повторного запуска программы в delphi?

Пользователь

от kenya , в категории: Другие , 2 года назад

Как сделать исключение повторного запуска программы в delphi?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

2 ответа

Пользователь

от johnpaul.blick , 2 года назад

@kenya 

В Delphi можно реализовать исключение повторного запуска программы с помощью следующих шагов:

  1. Создание мьютекса: В проекте Delphi создайте новый объект TMultiReadExclusiveWriteSynchronizer. Этот объект позволит одновременно читать и записывать данные, но не позволит запустить несколько экземпляров программы одновременно.
  2. Инициализация мьютекса: В методе FormCreate инициализируйте мьютекс, установив имя мьютекса.
  3. Проверка запуска: В методе FormCreate проверьте, удалось ли захватить мьютекс. Если захватить не удалось, это означает, что программа уже запущена, и вы можете закрыть приложение.


Ниже приведен пример кода:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
uses
  Windows,
  SyncObjs;

var
  Mutex: TMultiReadExclusiveWriteSynchronizer;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Mutex := TMultiReadExclusiveWriteSynchronizer.Create;
  try
    if Mutex.BeginWrite then
    begin
      Mutex.EndWrite;
    end
    else
    begin
      Application.Terminate;
    end;
  except
    Mutex.Free;
    raise;
  end;
end;

procedure


Пользователь

от marshall.cummings , год назад

@kenya 

TForm1.FormDestroy(Sender: TObject); begin Mutex.Free; end;


При создании формы в методе FormCreate мы пытаемся захватить мьютекс с помощью Mutex.BeginWrite. Если захватить мьютекс не удалось, значит программа уже запущена и мы вызываем Application.Terminate, чтобы закрыть приложение. Если удалось захватить мьютекс, то ничего не делаем и продолжаем нормальную работу программы.


В методе FormDestroy мы освобождаем выделенную память для мьютекса.


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