Как определить запуск второго приложения ? |
Здравствуйте, гость ( Вход | Регистрация )
Как определить запуск второго приложения ? |
Litkevich Yuriy |
3.6.2009, 17:49
Сообщение
#11
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
Я видел, предыдущую версию комерческую, там просто к своему проекту подстёгиваешь исходники и компилируешь. В текущей наверное также.
LGPL не допускает статической линковки, следовательно надо сначало собрать dll'ку (so'шку). и её пользовать. В LGPL'ной версии есть всё необходимое для такой сборки. Я думаю только в этом вся разница + примеры с соответствующим конкретной лицензии способом использования |
|
|
flankerr |
5.6.2009, 10:32
Сообщение
#12
|
Активный участник Группа: Участник Сообщений: 356 Регистрация: 9.1.2008 Пользователь №: 65 Спасибо сказали: 2 раз(а) Репутация: 0 |
Посмотрел исходники и выяснилось два момента
1. под Qt 4.3.3 это дело собрать нельзя т.к. отсутсвуют QLocalSocket и QLocalServer которые появидлись в Qt 4.4 2. особого смысла в QSingleApplication нет т.к. проще самому без всяких лицензий и замены QtCore сделать это самому. Там как оказалось всё реализовано на старой идее с сокетами. Сообщение отредактировал flankerr - 5.6.2009, 10:32 |
|
|
SABROG |
5.6.2009, 10:45
Сообщение
#13
|
Профессионал Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: 34 |
Никто не пробовал реализовывать тоже самое, но на базе QSystemSemaphore или QSharedMemory?
|
|
|
flankerr |
5.6.2009, 10:52
Сообщение
#14
|
Активный участник Группа: Участник Сообщений: 356 Регистрация: 9.1.2008 Пользователь №: 65 Спасибо сказали: 2 раз(а) Репутация: 0 |
Вот создаёшь ты QSharedMemory. Пользователь по доброте душевной грохает твою прогу через удаление процеса и шара так и остаётся висеть до перезагрузки компа. Тоже касается и других системных именованых объектов.
Так что реализация определения запущенных копий подобными способами хотя и проста но не надёжна. Сообщение отредактировал flankerr - 5.6.2009, 10:59 |
|
|
flankerr |
5.6.2009, 13:46
Сообщение
#15
|
Активный участник Группа: Участник Сообщений: 356 Регистрация: 9.1.2008 Пользователь №: 65 Спасибо сказали: 2 раз(а) Репутация: 0 |
Пока мутил с сокетами пришла в голову идея. Принцип действия как и через сокеты только вместо сокетов исползовать простой файл.
Прога запускается проверяет наличие файлика если его нет создаёт и прибавлет еденицу к счётчику записанному в файлик, а по выходу уменьшает счётчик и если он ноль удаляет файлик. Воропс с убийством процеса решается добавлением в файлик метки времени. Т.е. каждая копия программы ну скажем раз в минуту дёргает файл и обновляет метку времени. Если процесс убивается метка времени обновляться перестаёт и при следующем щапуске обнаружив файл прога смотрит метку времени если она слишком старая т.е. её время меньше на заданный промежуток чем текущие то данный файл считается недействительным и прога обнуляет счётчик. Сообщение отредактировал flankerr - 5.6.2009, 13:48 |
|
|
SABROG |
5.6.2009, 14:28
Сообщение
#16
|
Профессионал Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: 34 |
Цитата Т.е. каждая копия программы ты же вроде хотел, чтобы небыло копий программ? Цитата Если процесс убивается метка времени обновляться перестаёт Да нет, таже программа, что проверяет метку должна была её обновить минуту назад, поэтому время всегда будет актуальным. А если таких программ 3, то какая из них упала вообще не представляется возможным понять. Это надо вводить какой-нибудь ID для программ, чтобы они могли свои метки идентифицировать и файл не с счетчиком, а со списком:
Соответственно, если запускается новая копия программы нужно генерить уникальный ID и добавлять его в конец с текущим timestampом, если программа завершается корректно, то строку со своим ID нужно удалять. Проблема может возникнуть при выключении или перезагрузки компьютера пользователем, когда все программы завершаются корректно. Все копии ломанутся записывать в этот файл и скорее всего удачно сделает это всего лишь одна копия, которая будет завершатся первой. А все остальные копии получат какой-нибудь access denied на файлик и ОС просто прихлопнет эти копии, т.к. они не успели завершится за отведенный промежуток времени. |
|
|
flankerr |
5.6.2009, 15:03
Сообщение
#17
|
Активный участник Группа: Участник Сообщений: 356 Регистрация: 9.1.2008 Пользователь №: 65 Спасибо сказали: 2 раз(а) Репутация: 0 |
тут ты пошёл дальше Мне надо просто знать есть ли запущенные копии или нет. Т.е. вполне допускается ситуация когда работает несколько копий программы. Для этого вполне лдостаточно метки времени и счётчика. Каждая клпия раз в заданный промежуток обновляет метку времени что свидетельствует о валидность информации в файле.
Устанавливать каждому приложению уникальный номер слишком излишне. Тут нет задачи мониторить упало\не упало. А вот одновременный доступ на запись из несольких приложений тут тонкое место... возможно шаредМемори болеее луший вариант но его нет в Qt 4.3.3 а переходить на более новые версии нельзя. |
|
|
Sokoloff |
5.6.2009, 15:25
Сообщение
#18
|
Участник Группа: Участник Сообщений: 237 Регистрация: 1.4.2009 Из: Москва Пользователь №: 654 Спасибо сказали: 50 раз(а) Репутация: 11 |
А через список процессов нельзя определить есть запущенные копии? Да решение не кроссплатформенное, но IMHO самое прямое, или есть какие-то подводные камни?
|
|
|
Litkevich Yuriy |
5.6.2009, 15:29
Сообщение
#19
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
рекомендую на прогорге почитать ветку Константина, автора SingleApplication (не Qtишного), там много обсуждений о принципах работы, да и автора можно распросить поподробнее.
Ссылка |
|
|
flankerr |
8.6.2009, 16:46
Сообщение
#20
|
Активный участник Группа: Участник Сообщений: 356 Регистрация: 9.1.2008 Пользователь №: 65 Спасибо сказали: 2 раз(а) Репутация: 0 |
Что то не понравился мне SingleApplication. Во первых он работает только под Qt 4.4 и выше. Во вторых юзает ШаредМемори. Спрашивается зачем тогда сокеты, а если есть сокеты то зачем ШаредМемори - в общем намудрил не понравилось.
|
|
|
Текстовая версия | Сейчас: 30.12.2024, 20:36 |