Pull to refresh

Comments 8

Ну и каким таким образом скрытие консольного окна через HideConsole поможет вам избавиться от мерцания этого самого окна?

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

Почему ReadParamsFromPipe ожидает подключения клиента только 1 раз? Почему вы делаете в цикле CreateNamedPipe, а не ConnectNamedPipe?

Ну потому что программируют как умеют...

Интересно, а мьютекс освободится/разрушится если первый экземпляр программы упадет или будет убит извне?

Разумеется, все объекты ядра система "прибирает". Иначе бы любой "прибитый" процесс оставлял после себя тонны мусора.

В этом основное отличие именованных объектов ядра от допустим файлов. Как только релизится все экземпляры или завершаются процессы, создавший или открывший определенный объект, диспетчер объектов прибивает данный объект. Собственно сам по себе мютекс вообще не при делах. Эффект заключается просто в создании любого именованного объекта, просто при повторном создании система скажет, что объект с таким именем уже создан. Собственно хватило бы проверки создания самого именованного канала '\\.\pipe\ask_protocol_reader_pipe', создание мутанта в данном приложении совершенно лишнее, как указали выше

Аж олдскулы свело. Код для Delphi из далёкого 2008.

function AlreadyWorks(Str: PWideChar): Boolean;
var
  Hdle: THandle;
begin
  (* Проверяет наличие уже запущенного указанного экземпляра приложения *)

    //Открытие Мьютекса (виртуального файла)
  Hdle:=OpenMutex(MUTEX_ALL_ACCESS, False, Str);
    //... в памяти
  Result:=(Hdle<>0);
    //Если ещё не был создан, то создаём
  If Hdle=0 then CreateMutex(nil, False, Str);
end;

// И использование
program App;

uses
  Forms,
  Main in 'Main.pas' {fMain};

{$R *.res}

begin
   If AlreadyWorks('MyApp') then
   Begin
    // Тут показываем сообщение, что приложение уже запущено
    Exit;
  End;

  ...
  Application.Run;
end.

У вас в AlreadyWorks гонка, нет смысла проверять существование объекта перед созданием - всегда может оказаться, что он был создан уже после проверки.

Всем спасибо за замечания. Сделал дополнение к статье, постарался все учесть.

Sign up to leave a comment.

Articles