Russian Qt Forum

Qt => Общие вопросы => Тема начата: Hort от Ноябрь 20, 2008, 15:13



Название: Как определить запущено приложение или нет?
Отправлено: Hort от Ноябрь 20, 2008, 15:13
Как сделать чтобы твое приложение при запуске проверяло - оно уже запущено или нет. И если запущено то передавало переданные аргументы в открытое и зарывалось.
У меня файлы ассоциированы с приложением и хочется, чтобы каждый раз открывалось не новое приложение, а в уже существующем.


Название: Re: Как определить запущено приложение или нет?
Отправлено: pastor от Ноябрь 20, 2008, 15:22
См:

QtSingleApplication (http://trolltech.com/products/appdev/add-on-products/catalog/4/Utilities/qtsingleapplication/)
SingleApplication (http://qt-apps.org/content/show.php/SingleApplication?content=81163)
DSingleApplication (http://www.crossplatform.ru/node/761)


Название: Re: Как определить запущено приложение или нет?
Отправлено: Alex Custov от Ноябрь 20, 2008, 19:25
Как сделать чтобы твое приложение при запуске проверяло - оно уже запущено или нет. И если запущено то передавало переданные аргументы в открытое и зарывалось.
У меня файлы ассоциированы с приложением и хочется, чтобы каждый раз открывалось не новое приложение, а в уже существующем.

Обычно это делается с помощью IPC, типа DCOP. Но т.к. (в линуксе) нет 100% гарантии того, что запущен хоть какой-то IPC сервис, то самое элементарное что приходит в голову - слушающий TCP сокет.

Up: очевидно что-то типа DSingleApplication как показали.


Название: Re: Как определить запущено приложение или нет?
Отправлено: ритт от Ноябрь 24, 2008, 22:41
* у DSingleApplication имеется существенный недостаток - работа по tcp/ip. среднестатистической секретутке не объяснишь, что программа не запускается из-за отсутсвия прав на добавления исключения брндмауера...

* SingleApplication в данный момент напроч не поддерживает маковку, т.к. это уё?ище ?уй ложит на стандарты. в будущем планируется как-либо обойти это ограничение + дошлифовать ipc для снижения зависимостей

* QtSingleApplication всем хорош, использует нативные средства комуникации, но распространяется только под коммерческой лицензией


Название: Re: Как определить запущено приложение или нет?
Отправлено: Пантер от Ноябрь 25, 2008, 07:14
Интересно, а QtCreator какой метод использует? Просто заметил, что при его запуске в тэмповой папке создается файлик singleapplication (что-то типа того). Вот исходники откроют, посмотрим.
ИМХО, под виндой самый нормальный вариант - открыть файлик и держать его, а при втором запуске пытаться удалить. Вот только под Линухой данный вариант никак не катит.


Название: Re: Как определить запущено приложение или нет?
Отправлено: Hort от Ноябрь 25, 2008, 10:10
ИМХО, под виндой самый нормальный вариант - открыть файлик и держать его, а при втором запуске пытаться удалить. Вот только под Линухой данный вариант никак не катит.
а кстате как в qt заблокировать файл и разрешить например только чтение? в php припоминаю функция специальная была а сдесь?


Название: Re: Как определить запущено приложение или нет?
Отправлено: Pretorean от Ноябрь 25, 2008, 16:08
ИМХО, под виндой самый нормальный вариант - открыть файлик и держать его, а при втором запуске пытаться удалить. Вот только под Линухой данный вариант никак не катит.
а кстате как в qt заблокировать файл и разрешить например только чтение? в php припоминаю функция специальная была а сдесь?
открыть его на запись и не освобождать до завершения приложения ?


Название: Re: Как определить запущено приложение или нет?
Отправлено: ритт от Ноябрь 25, 2008, 16:45
мужики, вы бредить начинаете. с каких пор создание/открытие файла стало атомарной операцией? подозреваю, что QtCreator использует локалсокет в качестве ipc, но и это не атомарная операция.

повторюсь: идеальный вариант QtSingleApplication, т.к. использует нативные средства под разными платформами (к примеру, под вендой это будет создание атома для экземпляра - атомарная операция), но он коммерческий; SingleApplication использует системный семафор (также атомарная операция) для проверки на запущенный экземпляр + локалсокет для общения (т.к. через семафор общаться, к сожалению, нельзя), но он не работает под маковкой, т.к. дарвинисты упорно игнорят стандарт posix чуть более поздних редакций (примерно 2001 год - сейчас точно не скажу навскидку)

если задача поставлена _только_ как "определить запущено приложение или нет" и не нужно передавать команды запущенному экземпляру, то можно ограничиться системным мутексом. но, как я понял из первого поста, необходимо передавать список файлов для открытия - т.е. команды => ipc


Название: Re: Как определить запущено приложение или нет?
Отправлено: Грекас от Ноябрь 28, 2008, 13:00
А как сделать так, что б каждый последующий запущенный экземпляр программы проверял, работает ли уже его копия, если работает информировать уже работающую копию программы о том, что ей нужно отобразить себя, если нет - запустить программу.


Название: Re: Как определить запущено приложение или нет?
Отправлено: Hort от Ноябрь 28, 2008, 16:26
а ктонибуть знает как изменить название класса окна своего приложения? хочу искать запущенное приложение через FindWindow() (функция WinAPI). но чтобы найти надо передать класс окна, а он у всех Qt приложений по умолчанию "QWidget"


Название: Re: Как определить запущено приложение или нет?
Отправлено: ритт от Ноябрь 28, 2008, 19:02
А как сделать так, что б каждый последующий запущенный экземпляр программы проверял, работает ли уже его копия, если работает информировать уже работающую копию программы о том, что ей нужно отобразить себя, если нет - запустить программу.

смотри примеры в SingleApplication.
вчера пришло в голову как/чем равноценно заменить системный семафор чтобы работало и под маковками тоже - ждите новую версию.


Название: Re: Как определить запущено приложение или нет?
Отправлено: ритт от Ноябрь 29, 2008, 08:30
так-с, теперь должно и под маковками работать (нужно тестить)...
сегодня-завтра обновлю в "доп.компонентах" и на кутэ-аппзах...хочу ещё пошлифовать немного.
а пока что могу превьюху скинуть, если надо.


Название: Re: Как определить запущено приложение или нет?
Отправлено: ритт от Ноябрь 30, 2008, 01:13
обновил. http://www.qt-apps.org/content/show.php/SingleApplication?content=81163


Название: Re: Как определить запущено приложение или нет?
Отправлено: xintrea от Январь 20, 2009, 00:27
если задача поставлена _только_ как "определить запущено приложение или нет" и не нужно передавать команды запущенному экземпляру, то можно ограничиться системным мутексом.

А можно поинтересоваться, что имеется в виду под системным мутексом? У меня именно стоит задача просто определить, запущено приложение ии нет.


Название: Re: Как определить запущено приложение или нет?
Отправлено: ритт от Январь 20, 2009, 05:05
поскольку маковка игнорит общепринятые стандарты, использовать QSystemSemaphore в качестве атома под разными платформами не получилось (версии SA < 1.0). в версии 1.0 используется QSharedMemory - для лока достаточно, а вот для ipc - уже нет :(
посмотри в последней версии SA (кажется, isRunning())


Название: Re: Как определить запущено приложение или нет?
Отправлено: Winstrol от Январь 20, 2009, 11:11
мужики, вы бредить начинаете. с каких пор создание/открытие файла стало атомарной операцией?
А разве не атомарна? Другое дело медленно, но для этой задачи не принципиально.


Название: Re: Как определить запущено приложение или нет?
Отправлено: ритт от Январь 20, 2009, 18:52
ну, да. я неверно выразил мысль - имелось в виду, что не всегда невозможность создать/открыть файл говорит о том, что файл уже (не|)существует - нужны доп.проверки. конечно, можно реализовать так, чтобы всегда можно было с уверенностью сказать, что файл (не|)создан, но на главный вопрос - "запущено ли приложение?" - это не даст гарантированного ответа :) в принципе, с другими атомами в линуксах ситуация немногим лучше, но всё же...