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

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

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

wwswowsogon
постоялец
Сообщения: 157
Зарегистрирован: 23.12.2008 19:41:37

Сообщение wwswowsogon »

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

Код: Выделить всё

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 тоже должно быть всё нормально.
iskander
энтузиаст
Сообщения: 627
Зарегистрирован: 08.01.2012 18:43:34

Сообщение iskander »

Если правильно путаю, начиная с FPC-3.0.0 подобная функциональность появилась на уровне TCustomApplication.
Аватара пользователя
Alexander
энтузиаст
Сообщения: 864
Зарегистрирован: 18.12.2005 18:10:00
Откуда: оттуда
Контактная информация:

Сообщение Alexander »

Можно взять из http://soft.self-made-free.ru/GORG64_131.tar.xz urun.pas (общесистемно) или urunu.pas (для запустившего программу пользователя). Подключается просто: uses urun; или uses urunu;
iskander
энтузиаст
Сообщения: 627
Зарегистрирован: 08.01.2012 18:43:34

Сообщение iskander »

Alexander писал(а):Можно взять из http://soft.self-made-free.ru/GORG64_131.tar.xz urun.pas (общесистемно) или urunu.pas (для запустившего программу пользователя).
Можно наверно бы и взять, но речь-то как раз о том, что можно и не брать, поскольку эта функциональность уже имеется в FCL.
wwswowsogon
постоялец
Сообщения: 157
Зарегистрирован: 23.12.2008 19:41:37

Сообщение wwswowsogon »

iskander писал(а):Можно наверно бы и взять, но речь-то как раз о том, что можно и не брать, поскольку эта функциональность уже имеется в FCL.
Нельзя ли поподробнее? :) В каком виде она встроена в FCL, и как её использовать?
Аватара пользователя
Alexander
энтузиаст
Сообщения: 864
Зарегистрирован: 18.12.2005 18:10:00
Откуда: оттуда
Контактная информация:

Сообщение Alexander »

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

Не во всякой программе применяется сам FCL.
iskander
энтузиаст
Сообщения: 627
Зарегистрирован: 08.01.2012 18:43:34

Сообщение iskander »

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 реально нужна такая функция?
Аватара пользователя
Alexander
энтузиаст
Сообщения: 864
Зарегистрирован: 18.12.2005 18:10:00
Откуда: оттуда
Контактная информация:

Сообщение Alexander »

А зачем бы приложению на голой RTL реально нужна такая функция?
А в чём особенность FCL здесь вообще ? Многие программы без графики и без FCL нуждаются в такой функции.
Я делал такую блокировку в плеере органайзера, чтобы одновременно не играли несколько мелодий -- это голый RTL без графики и сам органайзер, для которого не предполагается двойной запуск как по интерфейсу, так и по доступу к файлам, но он не FCL, а MSE. Таких программ много, где уникальность запуска бывает нужна. Как с FCL, так и без.
iskander
энтузиаст
Сообщения: 627
Зарегистрирован: 08.01.2012 18:43:34

Сообщение iskander »

Alexander писал(а):А в чём особенность FCL здесь вообще ?
Скажу вам честно, этот вопрос ввёл меня в ступор. Особенность где?
Alexander писал(а):Многие программы без графики и без FCL нуждаются в такой функции.
Вы про гуй толкуете что ли?
Аватара пользователя
Alexander
энтузиаст
Сообщения: 864
Зарегистрирован: 18.12.2005 18:10:00
Откуда: оттуда
Контактная информация:

Сообщение Alexander »

Ну вообще: в чём особенность именно FCL здесь ? С точки зрения уникальности запуска любого приложения ?
FCL в принципе это когда работает связка FPC+Lazarus. Но есть же и другие связки (fpc+MSE, fpc+fpGUI, fpc+gtk, fpc+xlib,...) и "голый RTL без графики". Там FCL не применить.
FCL в принципе не совсем гуй, хотя и близко, но его предшественник VCL так и вообще гуй. Так что всё равно околографический.
iskander
энтузиаст
Сообщения: 627
Зарегистрирован: 08.01.2012 18:43:34

Сообщение iskander »

Alexander писал(а):FCL в принципе это когда работает связка FPC+Lazarus.
Ок, теперь понял. Но вы несколько заблуждаетесь, FCL это то, что находится в поставке FPC в папке /source/packages/ и к гую непосредственного отношения не имеет.
Аватара пользователя
Alexander
энтузиаст
Сообщения: 864
Зарегистрирован: 18.12.2005 18:10:00
Откуда: оттуда
Контактная информация:

Сообщение Alexander »

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

Сообщение iskander »

Alexander писал(а):Когда (на заре создания fpc) у разработчиков FPC дошла очередь до VCL они поняли, что не осилят и разделили задачу на две части: FCL взяли на себя, ограничив его неграфическими основами графических объектов
Если вам нравится воду в ступе толочь, я, разумеется, ничего не имею против. Но заниматься этим предлагаю самостоятельно.
Аватара пользователя
Alexander
энтузиаст
Сообщения: 864
Зарегистрирован: 18.12.2005 18:10:00
Откуда: оттуда
Контактная информация:

Сообщение Alexander »

Предложенный код всякий раз при попытке запустить второй экземпляр программы создаёт накапливающиеся в /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││     
xchgeaxeax
постоялец
Сообщения: 198
Зарегистрирован: 11.05.2023 02:51:40

Сообщение xchgeaxeax »

Alexander писал(а):Зачем ?
А что там в них записано на 14 байт. Подозреваю, что это параметры командной строки, чтобы можно было открыть много документов в одном окне на разных вкладках.
Ответить