Нужно в случае повторного запуска приложения отменить его и без лишних диалогов передать фокус окну уже открытого приложения. Я знаю как это делается для приложения виндовс, но как для линукс приложения не знаю. Дайте пожалуйста ссылочку на предыдущее обсуждение или расскажите как это сделать. Заранее спасибо
Блокировка повторного запуска приложения Linux
Модератор: Модераторы
Блокировка повторного запуска приложения Linux
Прошу прощения за баян, понимаю что не могло не обсуждаться... но не нашёл...
Нужно в случае повторного запуска приложения отменить его и без лишних диалогов передать фокус окну уже открытого приложения. Я знаю как это делается для приложения виндовс, но как для линукс приложения не знаю. Дайте пожалуйста ссылочку на предыдущее обсуждение или расскажите как это сделать. Заранее спасибо
Нужно в случае повторного запуска приложения отменить его и без лишних диалогов передать фокус окну уже открытого приложения. Я знаю как это делается для приложения виндовс, но как для линукс приложения не знаю. Дайте пожалуйста ссылочку на предыдущее обсуждение или расскажите как это сделать. Заранее спасибо
Я использую для этих целей SimpleIPC 
Mr.Smart, извиняюсь... ничего не понял... я собственно не программист, любитель, многого пока что не умею.
Для того что б прервать запуск приложения WIN и предать фокус окну уже запущенной копии приложения я правил файл [имя проекта].lpr, этому я научился по какой то статье ещё на дельфи. Тут (присланный вами) я так понимаю основной модуль приложения... по его содержанию и как этим пользоваться, я просто ничего не понял
Для того что б прервать запуск приложения WIN и предать фокус окну уже запущенной копии приложения я правил файл [имя проекта].lpr, этому я научился по какой то статье ещё на дельфи. Тут (присланный вами) я так понимаю основной модуль приложения... по его содержанию и как этим пользоваться, я просто ничего не понял
Использование:
Код: Выделить всё
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.
Получается данный код нужно размещать в главном модуле программы, правильно(?), так как к файлу проекта *.lpr всё это прикрутить не удалось... но у меня уже в этом *.lpr файле прописана заставка (небольшая картинка выскакивает на 3 секунды перед запуском приложения)... следовательно если я пропишу этот код в модуле главной формы приложения, у меня сперва будет выскакивать заставка а потом только отменятся повторный запуск приложения.
Есть другой вариант?
Есть другой вариант?
А что мешает разместить данный код в файле проекта?
Перед всеми остальными действиями производить проверку
Что может быть непонятно? Размещайте где удобно хоть в отдельном модуле и релизуйте любую логику!
Перед всеми остальными действиями производить проверку
Код: Выделить всё
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,я конечно извиняюсь за непроходимое ламерство, но когда сталкиваешся с чем то новым, не сложно споткнутся на вещах по сути простейших.
MyAppName - откудова брать это имя приложения?... имя модуля главной формы/ заголовок формы/Application.Title?
Как не пробовал он не компилится. Если не трудно пожалуйста подправте демку приложенную к посту.
MyAppName - откудова брать это имя приложения?... имя модуля главной формы/ заголовок формы/Application.Title?
Как не пробовал он не компилится. Если не трудно пожалуйста подправте демку приложенную к посту.
Я не понимаю, что у вас может не компилироваться? В приложенном выми проекте нехватает только одного модуля, который я выкладывал unique_utils.pas! Может всётаки из-за этого не компилируется?
Ещё раз повторю (я вам уже говорил это) Читайте сообщения компилятора!
Это строка должна быть уникальна для вашего приложения. Вы её придумываете сами!
qivi писал(а):MyAppName - откудова брать это имя приложения?...
Это строка должна быть уникальна для вашего приложения. Вы её придумываете сами!
- Attid
- долгожитель
- Сообщения: 2588
- Зарегистрирован: 27.10.2006 17:29:15
- Откуда: 44°32′23.63″N 41°2′25.2″E
- Контактная информация:
тут все давно написано до нас (с)
viewtopic.php?f=9&t=2159&start=0&st=0&sk=t&sd=a
viewtopic.php?f=9&t=2159&start=0&st=0&sk=t&sd=a
Может всётаки из-за этого не компилируется?
Да... оно самое
Всё работает..., только последний вопрос, как в случае блокировки повторного запуска приложения, поднять окно запущенной копии (приложения) над всеми прочими?
Например вот так
Mr.Smart писал(а):Например вот так
Почему то не подымает окно
Кстате, нашёл на эту тему интересный компонент... правда он то же не поднимает окно и проверил я его сейчас только под Вин32... домой приду проверю под Линукс...
Как всё же поднять окно... сложно ли заставить этот компонент (приложен к посту) подымать окно? Допустим добавить ему какой то параметр...
Проверить и дать рекомендации на счёт Linux сейчас не могу. Т.к. дома всё нахрен снёс и сижу с нет бука под клятой Windows 7
Данный мною код насколько я помню прекрасно работал под творением БГ.
Данный мною код насколько я помню прекрасно работал под творением БГ.
- leo_bsv
- постоялец
- Сообщения: 276
- Зарегистрирован: 04.08.2010 16:26:10
- Откуда: Йошкар-Ола
- Контактная информация:
Если есть необходимость имеется вот такой модуль: runonce.pas
Он занимается тем что не даёт приложению запускаться повторно и поднимает окно если приложение уже работает.
Он занимается тем что не даёт приложению запускаться повторно и поднимает окно если приложение уже работает.
Mr.Smart писал(а):Я использую для этих целей SimpleIPC
Прощу прощения за поднятие старой темы, но хочу убедиться, что все делаю правильно.
Код: Выделить всё
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 (при повторном запуске) проходит бесследно - я думал, будет ругань, однако все работает. Так должно быть?
