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

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

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

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

Сообщение wwswowsogon » 16.12.2023 21:54:55

Всем доброго времени суток!
Видимо, разработчики что-то поменяли в библиотеке.
Она немного глючит (не нашёл компонента при установке пакета, ну и при сборке одной демки ругается на отсутствие компилятора :)), но зато теперь вопрос запуска приложения только в одном экземпляре решается элементарно:
Код: Выделить всё
program windemo;

uses

uniqueinstanceraw;

{$R *.res}

begin

  if not InstanceRunning('любое_слово') then
    begin
      Application.Initialize;
      Application.CreateForm(TMain, Main);
      Application.CreateForm(TMsg1, Msg1);
      Application.Run;
    end;

Ранее иногда возникала такая задача, обычно я это не реализовывал либо из-за сложности реализации, либо (чаще) из-за отсутствия кроссплатформенности.
P. S. Хотя проверил пока только на Windows, но, думаю, на Linux тоже должно быть всё нормально.
wwswowsogon
постоялец
 
Сообщения: 152
Зарегистрирован: 23.12.2008 20:41:37

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

Сообщение iskander » 17.12.2023 09:49:21

Если правильно путаю, начиная с FPC-3.0.0 подобная функциональность появилась на уровне TCustomApplication.
iskander
энтузиаст
 
Сообщения: 606
Зарегистрирован: 08.01.2012 18:43:34

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

Сообщение Alexander » 17.12.2023 13:25:40

Можно взять из http://soft.self-made-free.ru/GORG64_131.tar.xz urun.pas (общесистемно) или urunu.pas (для запустившего программу пользователя). Подключается просто: uses urun; или uses urunu;
Аватара пользователя
Alexander
энтузиаст
 
Сообщения: 771
Зарегистрирован: 18.12.2005 19:10:00
Откуда: оттуда

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

Сообщение iskander » 17.12.2023 13:45:49

Alexander писал(а):Можно взять из http://soft.self-made-free.ru/GORG64_131.tar.xz urun.pas (общесистемно) или urunu.pas (для запустившего программу пользователя).

Можно наверно бы и взять, но речь-то как раз о том, что можно и не брать, поскольку эта функциональность уже имеется в FCL.
iskander
энтузиаст
 
Сообщения: 606
Зарегистрирован: 08.01.2012 18:43:34

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

Сообщение wwswowsogon » 17.12.2023 13:59:28

iskander писал(а):Можно наверно бы и взять, но речь-то как раз о том, что можно и не брать, поскольку эта функциональность уже имеется в FCL.


Нельзя ли поподробнее? :) В каком виде она встроена в FCL, и как её использовать?
wwswowsogon
постоялец
 
Сообщения: 152
Зарегистрирован: 23.12.2008 20:41:37

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

Сообщение Alexander » 17.12.2023 14:05:11

> уже имеется в FCL

Не во всякой программе применяется сам FCL.
Аватара пользователя
Alexander
энтузиаст
 
Сообщения: 771
Зарегистрирован: 18.12.2005 19:10:00
Откуда: оттуда

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

Сообщение iskander » 17.12.2023 14:57:33

wwswowsogon писал(а):Нельзя ли поподробнее? В каком виде она встроена в FCL, и как её использовать?

Чтобы соорудить простейший пример, пришлось порыться в документации.
Исходный .lpr файл(LCL приложение с одной формой):
Код: Выделить всё
program project1;

{$mode objfpc}{$H+}

uses
  {$IFDEF UNIX}
  cthreads,
  {$ENDIF}
  {$IFDEF HASAMIGA}
  athreads,
  {$ENDIF}
  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.CreateForm(TForm1, Form1);
  Application.Run;
end.

С использованием TApplication.SingleInstance:
Код: Выделить всё
program project1;

{$mode objfpc}{$H+}

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

{$R *.res}

begin
  RequireDerivedFormResource:=True;
  Application.Scaled:=True;
  Application.Initialize;
  Application.SingleInstanceEnabled := True;
  TAdvancedSingleInstance(Application.SingleInstance).Global := True; // для всех пользователей
  Application.SingleInstance.Start;
  if Application.SingleInstance.IsServer then begin
    Application.CreateForm(TForm1, Form1);
    Application.Run;
  end else begin
    Application.MessageBox('Уже запущено!', PChar(Application.Title), MB_OK or MB_IconExclamation);
    Application.SingleInstance.Stop;
  end;
end.


Alexander писал(а):Не во всякой программе применяется сам FCL.

А зачем бы приложению на голой RTL реально нужна такая функция?
iskander
энтузиаст
 
Сообщения: 606
Зарегистрирован: 08.01.2012 18:43:34

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

Сообщение Alexander » 17.12.2023 16:59:06

А зачем бы приложению на голой RTL реально нужна такая функция?


А в чём особенность FCL здесь вообще ? Многие программы без графики и без FCL нуждаются в такой функции.
Я делал такую блокировку в плеере органайзера, чтобы одновременно не играли несколько мелодий -- это голый RTL без графики и сам органайзер, для которого не предполагается двойной запуск как по интерфейсу, так и по доступу к файлам, но он не FCL, а MSE. Таких программ много, где уникальность запуска бывает нужна. Как с FCL, так и без.
Аватара пользователя
Alexander
энтузиаст
 
Сообщения: 771
Зарегистрирован: 18.12.2005 19:10:00
Откуда: оттуда

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

Сообщение iskander » 17.12.2023 17:42:32

Alexander писал(а):А в чём особенность FCL здесь вообще ?

Скажу вам честно, этот вопрос ввёл меня в ступор. Особенность где?

Alexander писал(а):Многие программы без графики и без FCL нуждаются в такой функции.

Вы про гуй толкуете что ли?
iskander
энтузиаст
 
Сообщения: 606
Зарегистрирован: 08.01.2012 18:43:34

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

Сообщение Alexander » 17.12.2023 17:56:47

Ну вообще: в чём особенность именно FCL здесь ? С точки зрения уникальности запуска любого приложения ?
FCL в принципе это когда работает связка FPC+Lazarus. Но есть же и другие связки (fpc+MSE, fpc+fpGUI, fpc+gtk, fpc+xlib,...) и "голый RTL без графики". Там FCL не применить.
FCL в принципе не совсем гуй, хотя и близко, но его предшественник VCL так и вообще гуй. Так что всё равно околографический.
Аватара пользователя
Alexander
энтузиаст
 
Сообщения: 771
Зарегистрирован: 18.12.2005 19:10:00
Откуда: оттуда

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

Сообщение iskander » 17.12.2023 18:16:45

Alexander писал(а):FCL в принципе это когда работает связка FPC+Lazarus.

Ок, теперь понял. Но вы несколько заблуждаетесь, FCL это то, что находится в поставке FPC в папке /source/packages/ и к гую непосредственного отношения не имеет.
iskander
энтузиаст
 
Сообщения: 606
Зарегистрирован: 08.01.2012 18:43:34

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

Сообщение Alexander » 17.12.2023 19:23:48

Не, не заблуждаюсь. Когда (на заре создания fpc) у разработчиков FPC дошла очередь до VCL они поняли, что не осилят и разделили задачу на две части: FCL взяли на себя, ограничив его неграфическими основами графических объектов, а LCL (с "верхней" реализацией графики) отдали разработчикам Лазаруса. То, что образовывало Делфи было TurboPascal+VCL, а то что образует Lazarus: FreePascal+FCL+LCL . Так что как раз имеет непосредственное отношение к гую, но ещё не сам гуй, а его неграфическая основа вполне самостоятельная при этом. Но FCL это часть Лазаруса - основа для LCL, а другие связки устроены по другому.
Аватара пользователя
Alexander
энтузиаст
 
Сообщения: 771
Зарегистрирован: 18.12.2005 19:10:00
Откуда: оттуда

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

Сообщение iskander » 17.12.2023 19:53:45

Alexander писал(а):Когда (на заре создания fpc) у разработчиков FPC дошла очередь до VCL они поняли, что не осилят и разделили задачу на две части: FCL взяли на себя, ограничив его неграфическими основами графических объектов

Если вам нравится воду в ступе толочь, я, разумеется, ничего не имею против. Но заниматься этим предлагаю самостоятельно.
iskander
энтузиаст
 
Сообщения: 606
Зарегистрирован: 08.01.2012 18:43:34

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

Сообщение Alexander » 17.12.2023 21:44:38

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

Код: Выделить всё
│ SI_project1                                     │      0│дек 17 20:26││                                        │       │            │
│ SI_project1-0AEE365D                            │     14│дек 17 20:26││                                        │       │            │
│ SI_project1-192D5F1C                            │     14│дек 17 20:26││                                        │       │            │
│ SI_project1-1FE5A04B                            │     14│дек 17 20:33││                                        │       │            │
│ SI_project1-2628710C                            │     14│дек 17 20:31││                                        │       │            │
│ SI_project1-28DDB114                            │     14│дек 17 20:32││                                        │       │            │
│ SI_project1-2F125AF5                            │     14│дек 17 20:32││                                        │       │            │
│ SI_project1-300E7842                            │     14│дек 17 20:32││                                        │       │            │
│ SI_project1-4FC6A83B                            │     14│дек 17 20:32││                                        │       │            │
│ SI_project1-51E456A0                            │     14│дек 17 20:33││                                        │       │            │
│ SI_project1-52842865                            │     14│дек 17 20:33││                                        │       │            │
│ SI_project1-5571A619                            │     14│дек 17 20:32││                                        │       │            │
│ SI_project1-6FE9038A                            │     14│дек 17 20:32││                                        │       │            │
│ SI_project1-7B647CA5                            │     14│дек 17 20:32││     
Аватара пользователя
Alexander
энтузиаст
 
Сообщения: 771
Зарегистрирован: 18.12.2005 19:10:00
Откуда: оттуда

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

Сообщение xchgeaxeax » 18.12.2023 04:27:31

Alexander писал(а):Зачем ?

А что там в них записано на 14 байт. Подозреваю, что это параметры командной строки, чтобы можно было открыть много документов в одном окне на разных вкладках.
xchgeaxeax
постоялец
 
Сообщения: 125
Зарегистрирован: 11.05.2023 03:51:40

Пред.След.

Вернуться в Lazarus

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

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

Рейтинг@Mail.ru