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

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

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

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

Сообщение qivi » 28.11.2009 21:46:01

Прошу прощения за баян, понимаю что не могло не обсуждаться... но не нашёл...
Нужно в случае повторного запуска приложения отменить его и без лишних диалогов передать фокус окну уже открытого приложения. Я знаю как это делается для приложения виндовс, но как для линукс приложения не знаю. Дайте пожалуйста ссылочку на предыдущее обсуждение или расскажите как это сделать. Заранее спасибо :)
Аватара пользователя
qivi
энтузиаст
 
Сообщения: 703
Зарегистрирован: 19.01.2009 13:45:54
Откуда: Россия

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

Сообщение Mr.Smart » 28.11.2009 22:32:33

Я использую для этих целей SimpleIPC :wink:
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

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

Сообщение qivi » 29.11.2009 00:50:39

Mr.Smart, извиняюсь... ничего не понял... я собственно не программист, любитель, многого пока что не умею.

Для того что б прервать запуск приложения WIN и предать фокус окну уже запущенной копии приложения я правил файл [имя проекта].lpr, этому я научился по какой то статье ещё на дельфи. Тут (присланный вами) я так понимаю основной модуль приложения... по его содержанию и как этим пользоваться, я просто ничего не понял :oops:
Аватара пользователя
qivi
энтузиаст
 
Сообщения: 703
Зарегистрирован: 19.01.2009 13:45:54
Откуда: Россия

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

Сообщение Mr.Smart » 29.11.2009 01:25:29

Использование:
Код: Выделить всё
program MyAppName;

uses unique_utils, ... // Добавим модуль
....
var
  MyUnique: TUniqueInstance;

...
begin
....
MyUnique:=TUniqueInstance.Create('MyAppName'); // Создадим экземпляр класса
if MyUnique.IsRunInstance then // Ааа уже запущенно! тогда закрываем
  begin
    MyUnique.Free;
    Halt(1);
  end;
  MyUnique.RunListen; // Запуск первого экземпляра приложения
  ...
  // Тут мы во всю работаем-работаем
  ...
  MyUnique.StopListen; // Уничтожаемся
  MyUnique.Free;
end.
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

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

Сообщение qivi » 29.11.2009 04:33:27

Получается данный код нужно размещать в главном модуле программы, правильно(?), так как к файлу проекта *.lpr всё это прикрутить не удалось... но у меня уже в этом *.lpr файле прописана заставка (небольшая картинка выскакивает на 3 секунды перед запуском приложения)... следовательно если я пропишу этот код в модуле главной формы приложения, у меня сперва будет выскакивать заставка а потом только отменятся повторный запуск приложения.

Есть другой вариант?
Аватара пользователя
qivi
энтузиаст
 
Сообщения: 703
Зарегистрирован: 19.01.2009 13:45:54
Откуда: Россия

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

Сообщение Mr.Smart » 29.11.2009 13:30:26

А что мешает разместить данный код в файле проекта?
Перед всеми остальными действиями производить проверку
Код: Выделить всё
begin
  MyUnique:=TUniqueInstance.Create('MyAppName'); // Создадим экземпляр класса
  if MyUnique.IsRunInstance then // Ааа уже запущенно! тогда закрываем
   begin
    MyUnique.Free;
    Halt(1);
   end;
  MyUnique.RunListen; // Запуск первого экземпляра приложения
  Application.Initialization;
  SplashScreen:=TSplashScreen.Create(Application);
  SplashScreen.Show;
  Sleep(3000);
  SplashScreen.Free;
  Application.CreateForm(TMainForm,MainForm);
  Application.Run;
  MyUnique.StopListen; // Уничтожаемся
  MyUnique.Free;
end.

Что может быть непонятно? Размещайте где удобно хоть в отдельном модуле и релизуйте любую логику!
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

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

Сообщение qivi » 03.12.2009 04:02:32

Mr.Smart,я конечно извиняюсь за непроходимое ламерство, но когда сталкиваешся с чем то новым, не сложно споткнутся на вещах по сути простейших.
MyAppName - откудова брать это имя приложения?... имя модуля главной формы/ заголовок формы/Application.Title?

Как не пробовал он не компилится. Если не трудно пожалуйста подправте демку приложенную к посту.
Аватара пользователя
qivi
энтузиаст
 
Сообщения: 703
Зарегистрирован: 19.01.2009 13:45:54
Откуда: Россия

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

Сообщение Mr.Smart » 03.12.2009 13:55:22

Я не понимаю, что у вас может не компилироваться? В приложенном выми проекте нехватает только одного модуля, который я выкладывал unique_utils.pas! Может всётаки из-за этого не компилируется? :wink: Ещё раз повторю (я вам уже говорил это) Читайте сообщения компилятора!
qivi писал(а):MyAppName - откудова брать это имя приложения?...

Это строка должна быть уникальна для вашего приложения. Вы её придумываете сами!
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

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

Сообщение Attid » 03.12.2009 22:31:59

тут все давно написано до нас (с)
viewtopic.php?f=9&t=2159&start=0&st=0&sk=t&sd=a
Аватара пользователя
Attid
долгожитель
 
Сообщения: 2585
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E

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

Сообщение qivi » 04.12.2009 00:51:54

Может всётаки из-за этого не компилируется? :wink:

Да... оно самое :oops:
Всё работает..., только последний вопрос, как в случае блокировки повторного запуска приложения, поднять окно запущенной копии (приложения) над всеми прочими?
Аватара пользователя
qivi
энтузиаст
 
Сообщения: 703
Зарегистрирован: 19.01.2009 13:45:54
Откуда: Россия

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

Сообщение Mr.Smart » 04.12.2009 12:08:16

Например вот так
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

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

Сообщение qivi » 28.01.2010 17:41:21

Mr.Smart писал(а):Например вот так

Почему то не подымает окно :oops: :|

Кстате, нашёл на эту тему интересный компонент... правда он то же не поднимает окно и проверил я его сейчас только под Вин32... домой приду проверю под Линукс...

Как всё же поднять окно... сложно ли заставить этот компонент (приложен к посту) подымать окно? Допустим добавить ему какой то параметр...
UI.7z
Аватара пользователя
qivi
энтузиаст
 
Сообщения: 703
Зарегистрирован: 19.01.2009 13:45:54
Откуда: Россия

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

Сообщение Mr.Smart » 31.01.2010 16:13:01

Проверить и дать рекомендации на счёт Linux сейчас не могу. Т.к. дома всё нахрен снёс и сижу с нет бука под клятой Windows 7 :oops:
Данный мною код насколько я помню прекрасно работал под творением БГ.
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

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

Сообщение leo_bsv » 28.10.2010 21:55:36

Если есть необходимость имеется вот такой модуль: runonce.pas
Он занимается тем что не даёт приложению запускаться повторно и поднимает окно если приложение уже работает.
Аватара пользователя
leo_bsv
постоялец
 
Сообщения: 276
Зарегистрирован: 04.08.2010 16:26:10
Откуда: Йошкар-Ола

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

Сообщение Владимир » 19.10.2013 15:31:22

Mr.Smart писал(а):Я использую для этих целей SimpleIPC :wink:

Прощу прощения за поднятие старой темы, но хочу убедиться, что все делаю правильно.
Код: Выделить всё
program ProjClean;

{$mode objfpc}{$H+}

uses
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}
  Interfaces, // this includes the LCL widgetset
  Forms
  { you can add units after this },FileUtil, unclean,support;
begin
CreateClientServer;
  if ConnectServer then begin
  Application.Title:=SysToUtf8('AKKOP');
  Application.Initialize;
  Application.CreateForm(TMainFrm, MainFrm);
  Application.Run;
  end else begin
  mess_sh('Попытка повторного запуска');
  end;
end.

Собственно код
Код: Выделить всё
procedure CreateClientServer;
begin
IPCServer:=TSimpleIPCServer.Create(nil);
IPCServer.Global:=True;
IPCServer.ServerID:='clean';
IPCServer.Active:=False;
IPCServer.StartServer;
IPCClient:=TSimpleIPCClient.Create(nil);
IPCClient.ServerID:='clean';
IPCClient.Active:=False;
end;

function ConnectServer:Boolean;
begin
ConnectServer:=True;
try
IPCClient.Connect;
except
ConnectServer:=False;
end;
end;


Несколько смущает, что повторный вызов CreateClientServer (при повторном запуске) проходит бесследно - я думал, будет ругань, однако все работает. Так должно быть?
Владимир
постоялец
 
Сообщения: 355
Зарегистрирован: 23.08.2007 19:48:39
Откуда: Москва

След.

Вернуться в Lazarus

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

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

Рейтинг@Mail.ru