Освобождение мьютекса, созданного при запуске в том же приложении - PullRequest
1 голос
/ 09 июля 2020

Я создаю мьютекс в начале своего приложения, в первую очередь для предотвращения запуска двух экземпляров одного и того же приложения.

  if CreateMutex(nil,false,'Proton Studio') = 0 then
    RaiseLastOSError;
  if GetLastError = ERROR_ALREADY_EXISTS then exit;

Однако, когда я перенастраиваю свое приложение, мне нужно освободить мьютекс перед приложением закрывается, чтобы запустить короткую программу, которая затем перезапустит мое приложение.

  hw := OpenMutex(MUTEX_ALL_ACCESS, false, 'Proton Studio');
  if ReleaseMutex(hw)then begin
    if ShellExecute(application.Handle, 'open',
    Pchar('StudioRestart.exe'), PChar(Application.ExeName),'', SW_SHOWNORMAL) > 32 then
      fmIDEMain.Close
    else
      ShowMessage('Unable to Restart, please close and restart manually')
  end

OpenMutex возвращает дескриптор, но когда я вызываю ReleaseMutex, функция возвращает false. Как мне закрыть этот мьютекс?

1 Ответ

1 голос
/ 09 июля 2020

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

Я вижу следующие способы решения вашей проблемы:

  1. Уничтожьте мьютекс вместо того, чтобы пытаться его освободить.

Вместо ReleaseMutex используйте CloseHandle для уничтожения мьютекса. Если вы единственный, кто держит дескриптор мьютекса, он исчезнет впоследствии.

Для этой цели запомните исходный дескриптор, возвращенный CreateMutex, и не открывайте мьютекс второй раз.

Используйте мьютексы по назначению

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

Внешняя программа должна подождать (мой предпочтительный метод)

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

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