Блокировка повторного запуска приложения Linux

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Re: Блокировка повторного запуска приложения Linux

Сообщение Alexander » 18.12.2023 07:13:00

Это не похоже на буквы и параметры:

Код: Выделить всё
hexdump SI_project1-2774B5DF
0000000 0002 fffc ffff 0000 0000 0000 0000     
000000e
Аватара пользователя
Alexander
энтузиаст
 
Сообщения: 771
Зарегистрирован: 18.12.2005 19:10:00
Откуда: оттуда

Re: Блокировка повторного запуска приложения Linux

Сообщение iskander » 18.12.2023 11:57:03

Alexander писал(а):Предложенный код всякий раз при попытке запустить второй экземпляр программы создаёт накапливающиеся в /tmp при каждом запуске лок файлы следующего вида. Зачем ?

Эти записи плодит AdvancedIPC, похоже это у него способ передачи сообщений такой, вроде ничего криминального, по завершении приложение прибирается за собой.
В любом случае, исходники библиотек FPC открыты, при желании можно найти ответ на любой интересующий вопрос, если пользуетесь Лазарем, CTRL+Click ваш друг.
xchgeaxeax писал(а):А что там в них записано на 14 байт. Подозреваю, что это параметры командной строки, чтобы можно было открыть много документов в одном окне на разных вкладках.

Заголовок AdvancedIPC.TMessageHeader как раз 14 байт.

А если хочется передать параметры командной строки, требуются дополнительные телодвижения.
В модуле формы:
Код: Выделить всё
unit Unit1;

{$mode objfpc}{$h+}

interface

uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, ExtCtrls,
  SingleInstance;

type

  { TForm1 }

  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private

  public
    procedure OtherInstanceParams(Sender: TBaseSingleInstance; aList: TStringList);
    procedure AppIdleHandler(Sender: TObject; var Done: Boolean);
  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.FormCreate(Sender: TObject);
begin
  Application.OnIdle := @AppIdleHandler;
end;

procedure TForm1.OtherInstanceParams(Sender: TBaseSingleInstance; aList: TStringList);
begin
  if WindowState = wsMinimized then
    Application.Restore;
  Application.BringToFront;
  ShowMessage('Попытка запуска другого экземпляра.'+LineEnding+'Параметры запуска:'+LineEnding+aList.Text);
end;

procedure TForm1.AppIdleHandler(Sender: TObject; var Done: Boolean);
begin
  Application.SingleInstance.ServerCheckMessages;
  Done := True;
end;

end.

Модуль приложения:
Код: Выделить всё
program project1;

{$mode objfpc}{$H+}

uses
  {$IFDEF UNIX}
  cthreads,
  {$ENDIF}
  {$IFDEF HASAMIGA}
  athreads,
  {$ENDIF}
  AdvancedSingleInstance, //обязательно перед Interfaces, подключает TAdvancedSingleInstance
  Interfaces, // this includes the LCL widgetset
  Forms, Unit1
  { you can add units after this };

{$R *.res}

begin
  RequireDerivedFormResource:=True;
  Application.Scaled:=True;
  Application.Initialize;
  Application.SingleInstanceEnabled := True;
  Application.SingleInstance.Start;
  if Application.SingleInstance.IsServer then begin
    Application.CreateForm(TForm1, Form1);
    TAdvancedSingleInstance(Application.SingleInstance).OnServerReceivedParams := @Form1.OtherInstanceParams;
    Application.Run;
  end else
    TAdvancedSingleInstance(Application.SingleInstance).ClientPostParams;
end.

Как-то так наверно, но там есть ещё некоторые нюансы.
iskander
энтузиаст
 
Сообщения: 606
Зарегистрирован: 08.01.2012 18:43:34

Re: Блокировка повторного запуска приложения Linux

Сообщение Tango » 22.03.2024 13:24:03

Изображение

В пространстве пользователя есть точка монтирования /run/user/1000 там можно создавать файлы и папки. Они живут только одну сессию.
Аватара пользователя
Tango
постоялец
 
Сообщения: 162
Зарегистрирован: 31.05.2012 17:07:30

Пред.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 21

Рейтинг@Mail.ru