Надо при запуске приложения определять есть ли уже запущанная копия(и) этого приложения.
Впрос как ?
http://www.qtsoftware.com/products/appdev/add-on-products/catalog/4/Utilities/qtsingleapplication
Используется вместо QApplication или QCoreApplication
QSingleApplication в Qt 4.3.3 что-то не нашёл.
Но судя из названия и из того что им надо заменить стандартный апликейшен можно сделать вывод что он не позволяет запускать копию. Тогда как мой вопрос звучал иначе,а имено
Как определить что уже запущена копия ?
т.е. мне НЕ нужно запрещать мне просто нужно в момент запуска знать есть ли уже запущенаая копия приложения
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).
а чем платная версия отличается от свободной ?
но всё равно не понятно почему они отдельно выложили платную версию и отдельно свободную - если различия только в выше описанном тогда не понятно зачем разделять
Там наверно в хедерах написано под какую они лицуху.
Я видел, предыдущую версию комерческую, там просто к своему проекту подстёгиваешь исходники и компилируешь. В текущей наверное также.
LGPL не допускает статической линковки, следовательно надо сначало собрать dll'ку (so'шку). и её пользовать. В LGPL'ной версии есть всё необходимое для такой сборки.
Я думаю только в этом вся разница + примеры с соответствующим конкретной лицензии способом использования
Посмотрел исходники и выяснилось два момента
1. под Qt 4.3.3 это дело собрать нельзя т.к. отсутсвуют QLocalSocket и QLocalServer которые появидлись в Qt 4.4
2. особого смысла в QSingleApplication нет т.к. проще самому без всяких лицензий и замены QtCore сделать это самому. Там как оказалось всё реализовано на старой идее с сокетами.
Никто не пробовал реализовывать тоже самое, но на базе QSystemSemaphore или QSharedMemory?
Вот создаёшь ты QSharedMemory. Пользователь по доброте душевной грохает твою прогу через удаление процеса и шара так и остаётся висеть до перезагрузки компа. Тоже касается и других системных именованых объектов.
Так что реализация определения запущенных копий подобными способами хотя и проста но не надёжна.
Пока мутил с сокетами пришла в голову идея. Принцип действия как и через сокеты только вместо сокетов исползовать простой файл.
Прога запускается проверяет наличие файлика если его нет создаёт и прибавлет еденицу к счётчику записанному в файлик, а по выходу уменьшает счётчик и если он ноль удаляет файлик.
Воропс с убийством процеса решается добавлением в файлик метки времени.
Т.е. каждая копия программы ну скажем раз в минуту дёргает файл и обновляет метку времени. Если процесс убивается метка времени обновляться перестаёт и при следующем щапуске обнаружив файл прога смотрит метку времени если она слишком старая т.е. её время меньше на заданный промежуток чем текущие то данный файл считается недействительным и прога обнуляет счётчик.
1244204575 rlipkalihu
1244204617 fxakstrqta
1244204624 grswkhxfjr
тут ты пошёл дальше Мне надо просто знать есть ли запущенные копии или нет. Т.е. вполне допускается ситуация когда работает несколько копий программы. Для этого вполне лдостаточно метки времени и счётчика. Каждая клпия раз в заданный промежуток обновляет метку времени что свидетельствует о валидность информации в файле.
Устанавливать каждому приложению уникальный номер слишком излишне. Тут нет задачи мониторить упало\не упало.
А вот одновременный доступ на запись из несольких приложений тут тонкое место... возможно шаредМемори болеее луший вариант но его нет в Qt 4.3.3 а переходить на более новые версии нельзя.
А через список процессов нельзя определить есть запущенные копии? Да решение не кроссплатформенное, но IMHO самое прямое, или есть какие-то подводные камни?
рекомендую на прогорге почитать ветку Константина, автора SingleApplication (не Qtишного), там много обсуждений о принципах работы, да и автора можно распросить поподробнее.
http://www.prog.org.ru/topic_7213_0.html
Что то не понравился мне SingleApplication. Во первых он работает только под Qt 4.4 и выше. Во вторых юзает ШаредМемори. Спрашивается зачем тогда сокеты, а если есть сокеты то зачем ШаредМемори - в общем намудрил не понравилось.
Повторюсь,если использовать шаредМемори то пропадает всякий смысл в сокетах.
Кстати недостатки описанной мной выше идеи с файлами убераються использованием ШаредМемори
Добавлю сюда код с определением запуска через сокеты на 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
всё таки это всё какие-то извраты. Лучше использовать отлаженную кросплатформенную библиотеку от самих тролей.
Пока она была не доступна по LGPL, люди делали её аналог, и проверили кучу механизмов которые работали бы всюду. в Том числе и в многопользовательской среде.
"Добавлю сюда код с определением запуска через сокеты на WinAPI"
Перепутал: не сокеты, а мьютексы!!!
Litkevich Yuriy, для быстрой сдачи пригодится.
Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)