Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как определить запуск второго приложения ?
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Общие вопросы
flankerr
Надо при запуске приложения определять есть ли уже запущанная копия(и) этого приложения.
Впрос как ?
Litkevich Yuriy
QSingleApplication
Используется вместо QApplication или QCoreApplication
flankerr
QSingleApplication в Qt 4.3.3 что-то не нашёл.
Но судя из названия и из того что им надо заменить стандартный апликейшен можно сделать вывод что он не позволяет запускать копию. Тогда как мой вопрос звучал иначе,а имено
Как определить что уже запущена копия ?
т.е. мне НЕ нужно запрещать мне просто нужно в момент запуска знать есть ли уже запущенаая копия приложения
SABROG
bool QtSingleApplication::isRunning ()

Returns true if another instance of this application is running; otherwise false.

This function does not find instances of this application that are being run by a different user (on Windows: that are running in another session).
Litkevich Yuriy
Цитата(flankerr @ 3.6.2009, 20:08) *
QSingleApplication в Qt 4.3.3 что-то не нашёл.
я тебе ссылку дал, раньше это было решение только для платников, теперь и под LGPL распространяется
flankerr
а чем платная версия отличается от свободной ?
Litkevich Yuriy
Цитата(flankerr @ 3.6.2009, 21:15) *
а чем платная версия отличается от свободной ?
лицензией
SABROG
Цитата(flankerr @ 3.6.2009, 18:15) *
а чем платная версия отличается от свободной ?

Тем, что раньше тебе надо было приобрести лицензию Qt, чтобы скачать этот класс и работать с ним или искать ворованную.

Если имеется ввиду то, что есть сейчас платная, так это также как с исходниками Qt. Если у тебя есть платная лицензия, то ты можешь изменять исходники Qt и исходники этого класса и продавать как собственную программу, иначе только использовать эти классы и продавать, но не изменять и продавать.
flankerr
но всё равно не понятно почему они отдельно выложили платную версию и отдельно свободную - если различия только в выше описанном тогда не понятно зачем разделять
SABROG
Там наверно в хедерах написано под какую они лицуху.
Litkevich Yuriy
Я видел, предыдущую версию комерческую, там просто к своему проекту подстёгиваешь исходники и компилируешь. В текущей наверное также.

LGPL не допускает статической линковки, следовательно надо сначало собрать dll'ку (so'шку). и её пользовать. В LGPL'ной версии есть всё необходимое для такой сборки.

Я думаю только в этом вся разница + примеры с соответствующим конкретной лицензии способом использования
flankerr
Посмотрел исходники и выяснилось два момента
1. под Qt 4.3.3 это дело собрать нельзя т.к. отсутсвуют QLocalSocket и QLocalServer которые появидлись в Qt 4.4
2. особого смысла в QSingleApplication нет т.к. проще самому без всяких лицензий и замены QtCore сделать это самому. Там как оказалось всё реализовано на старой идее с сокетами.
SABROG
Никто не пробовал реализовывать тоже самое, но на базе QSystemSemaphore или QSharedMemory?
flankerr
Вот создаёшь ты QSharedMemory. Пользователь по доброте душевной грохает твою прогу через удаление процеса и шара так и остаётся висеть до перезагрузки компа. Тоже касается и других системных именованых объектов.
Так что реализация определения запущенных копий подобными способами хотя и проста но не надёжна.
flankerr
Пока мутил с сокетами пришла в голову идея. Принцип действия как и через сокеты только вместо сокетов исползовать простой файл.

Прога запускается проверяет наличие файлика если его нет создаёт и прибавлет еденицу к счётчику записанному в файлик, а по выходу уменьшает счётчик и если он ноль удаляет файлик.

Воропс с убийством процеса решается добавлением в файлик метки времени.

Т.е. каждая копия программы ну скажем раз в минуту дёргает файл и обновляет метку времени. Если процесс убивается метка времени обновляться перестаёт и при следующем щапуске обнаружив файл прога смотрит метку времени если она слишком старая т.е. её время меньше на заданный промежуток чем текущие то данный файл считается недействительным и прога обнуляет счётчик.
SABROG
Цитата
Т.е. каждая копия программы

:blink: ты же вроде хотел, чтобы небыло копий программ?

Цитата
Если процесс убивается метка времени обновляться перестаёт

Да нет, таже программа, что проверяет метку должна была её обновить минуту назад, поэтому время всегда будет актуальным. А если таких программ 3, то какая из них упала вообще не представляется возможным понять. Это надо вводить какой-нибудь ID для программ, чтобы они могли свои метки идентифицировать и файл не с счетчиком, а со списком:

1244204575 rlipkalihu
1244204617 fxakstrqta
1244204624 grswkhxfjr


Соответственно, если запускается новая копия программы нужно генерить уникальный ID и добавлять его в конец с текущим timestampом, если программа завершается корректно, то строку со своим ID нужно удалять. Проблема может возникнуть при выключении или перезагрузки компьютера пользователем, когда все программы завершаются корректно. Все копии ломанутся записывать в этот файл и скорее всего удачно сделает это всего лишь одна копия, которая будет завершатся первой. А все остальные копии получат какой-нибудь access denied на файлик и ОС просто прихлопнет эти копии, т.к. они не успели завершится за отведенный промежуток времени.
flankerr
тут ты пошёл дальше :) Мне надо просто знать есть ли запущенные копии или нет. Т.е. вполне допускается ситуация когда работает несколько копий программы. Для этого вполне лдостаточно метки времени и счётчика. Каждая клпия раз в заданный промежуток обновляет метку времени что свидетельствует о валидность информации в файле.

Устанавливать каждому приложению уникальный номер слишком излишне. Тут нет задачи мониторить упало\не упало.

А вот одновременный доступ на запись из несольких приложений тут тонкое место... возможно шаредМемори болеее луший вариант но его нет в Qt 4.3.3 а переходить на более новые версии нельзя.
Sokoloff
А через список процессов нельзя определить есть запущенные копии? Да решение не кроссплатформенное, но IMHO самое прямое, или есть какие-то подводные камни?
Litkevich Yuriy
рекомендую на прогорге почитать ветку Константина, автора SingleApplication (не Qtишного), там много обсуждений о принципах работы, да и автора можно распросить поподробнее.

Ссылка
flankerr
Что то не понравился мне SingleApplication. Во первых он работает только под Qt 4.4 и выше. Во вторых юзает ШаредМемори. Спрашивается зачем тогда сокеты, а если есть сокеты то зачем ШаредМемори - в общем намудрил не понравилось.
BRE
Цитата(flankerr @ 8.6.2009, 17:46) *
Что то не понравился мне SingleApplication. Во первых он работает только под Qt 4.4 и выше. Во вторых юзает ШаредМемори. Спрашивается зачем тогда сокеты, а если есть сокеты то зачем ШаредМемори - в общем намудрил не понравилось.

Юра выше писал, автор SingleApplication известен, спроси у него для чего используется SharedMemory. Помниться, читал ветку посвященную этому компоненту, там вроде были какие-то косяки с сокетами на Mac'е.
flankerr
Повторюсь,если использовать шаредМемори то пропадает всякий смысл в сокетах.
Кстати недостатки описанной мной выше идеи с файлами убераються использованием ШаредМемори
Cergey
Добавлю сюда код с определением запуска через сокеты на WinAPI. Просто что-бы другие(и я) не искали после прочтения темы в гугле это.
HANDLE hnd = CreateMutex(NULL, TRUE, m_pszAppName);
if ( GetLastError() == ERROR_ALREADY_EXISTS && WAIT_ABANDONED != WaitForSingleObject(hnd, 1000))
{
AfxMessageBox("Application already running. ");
return FALSE;
}

Взято с http://forum.ixbt.com/topic.cgi?id=40:682

Стати для тех кто первый раз видит WinAPI
m_pszAppName - unicode строка
В QT для быстрого перевода можно использовать

QString text = "Lab 2 Server"; // Имя приложения
TCHAR* m_pszAppName = (TCHAR *)text.unicode(); // Имя в формате Unicode
Litkevich Yuriy
всё таки это всё какие-то извраты. Лучше использовать отлаженную кросплатформенную библиотеку от самих тролей.
Пока она была не доступна по LGPL, люди делали её аналог, и проверили кучу механизмов которые работали бы всюду. в Том числе и в многопользовательской среде.
Cergey
"Добавлю сюда код с определением запуска через сокеты на WinAPI"
Перепутал: не сокеты, а мьютексы!!!
Litkevich Yuriy, для быстрой сдачи пригодится.
SABROG
Цитата(Cergey @ 27.11.2009, 19:06) *
для быстрой сдачи пригодится.

Вот оказывается для чего программирование нужно, для быстрой сдачи! А я то дурак уже не учусь, а всё сдаю и сдаю из-за интереса...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2021 IPS, Inc.