Поиск:

Ответ в темуСоздание новой темы Создание опроса
> использование QSharedMemory 
:(
    Опции темы
gordmiand
Дата 9.12.2013, 20:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 772
Регистрация: 15.4.2007

Репутация: нет
Всего: 0



Мне надо сделать защиту от множественного запуска приложения, работающего под линуксом (убунту) пробую так:
Код

int main(int argc, char *argv[])
{
  QApplication a(argc, argv);

  QSharedMemory sharedMemory("ProgrammName");

  if (!sharedMemory.create(1) && sharedMemory.error() == QSharedMemory::AlreadyExists)
   exit(1);

  MainWindow w;
  w.show();

  return a.exec();
}

Вроде бы все работает верно, но только если я закрываю приложение крестиком на главной форме приложения (код завершения приложения "0")...  если же я закрываю приложение через кнопку "Остановить" qt-креатора или по ctrl/c (при запуске из терминала), т.е. с кодом завершения приложения "1", то созданный sharedMemory "не убивается" при выходе из приложения и соответственно больше не запускается (выполняется exit(1))...так как же мне "убивать" созданный sharedMemory при "аварийном" выходе программы??? под виндой такой проблемы почему-то нет...
PM MAIL   Вверх
Majestio
Дата 9.12.2013, 21:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 83
Регистрация: 19.12.2010

Репутация: нет
Всего: нет



Мож попробовать так?

По поводу закрытия ... если прописать свой обработчик?
Код

void MainWindow::closeEvent(QCloseEvent *event)
{
    if (надо убивать шару памяти?) {
        убиваем шару в памяти
    }
    event->accept();
}

PM MAIL WWW   Вверх
gordmiand
Дата 9.12.2013, 21:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 772
Регистрация: 15.4.2007

Репутация: нет
Всего: 0



нет, QtSingleApplication - это сторонний класс, мне же надо решить мой вопрос стандартными qt-ми средствами...так в том-то и вопрос - как убить sharedmemory и как убить в Mainwindow sharedmemory, созданный в main? и все равно closeEvent не вызывается при аварийном выходе...

Это сообщение отредактировал(а) gordmiand - 9.12.2013, 21:42
PM MAIL   Вверх
Majestio
Дата 10.12.2013, 03:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 83
Регистрация: 19.12.2010

Репутация: нет
Всего: нет



Цитата(gordmiand @ 9.12.2013,  21:37)
нет, QtSingleApplication - это сторонний класс, мне же надо решить мой вопрос стандартными qt-ми средствами...так в том-то и вопрос - как убить sharedmemory и как убить в Mainwindow sharedmemory, созданный в main?


С разделяемой памятью - видимо засада. Судя по описанию, в Sytem V - ею владеет система, а не процесс. И при вылете она остается залоченой.

Пол линухом нет возможности поэксперементировать, может такое поможет:
Код

#include <signal.h>
#include <QApplication>
#include <QDebug>
#include "dialog.h"

void fall()
{
      int* p = 0x00000000;
      *p = 13;
}

void posix_catch_signal(int signum)
{
    qDebug() << "Signal catched:" << signum;
    signal(signum, SIG_DFL);
    exit(signum);
}

int main(int argc, char *argv[])
{
    for (int i = 0; i < 16; ++i) signal(i, posix_catch_signal);
    QApplication a(argc, argv);
    Dialog w;
    w.show();
    //  раскоментировать, чтобы словить  SIGSEGV (Segmentation Fault):
    // fall();
    return a.exec();
}


А вообще, думаю, лучше этот вопрос решать через .pid-файлы и flock, например:
1) Программа запускается смотрит ли есть /var/run/программа.pid (размещение для FreeBSD, в линухе не помню)
2) Если нет - создает pid-файл, флокает его, записывает в него свой PID (снимает блокировку?)
3) Если есть - ищет PID среди запущенных процессов, если нет - jmp п.2
4) Если есть среди запущеных - выход или активация той запущеной копии 
PM MAIL WWW   Вверх
vinter
Дата 10.12.2013, 06:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 3
Всего: 56



Цитата(gordmiand @  9.12.2013,  22:37 Найти цитируемый пост)
нет, QtSingleApplication - это сторонний класс, мне же надо решить мой вопрос стандартными qt-ми средствами.

Этот класс, насколько я помню, в своё время сделан самими Trolltech. Если уже совсем не хочется его использовать, то можно посмотреть как он сделан. Если мне память не изменяет, то он построен на сокетах.


--------------------
Мой блог
PM MAIL WWW   Вверх
gordmiand
Дата 10.12.2013, 21:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 772
Регистрация: 15.4.2007

Репутация: нет
Всего: 0



нашел статью про однократный запуск приложения, в нем приводится такой пример
Код

QSustemSemaphore sema("<Unique name1>", 1);
bool isRunning;
sema.acquire();

   QSharedMemory shmem("<Unique name2>");
   shmem.attach();

QSharedMemory shmem("<Unique name2>");
if (shmem.attach())
   isRunning = true;
else
{
   shmem.create(1);
    isRunning = false;
}
sema.release();

по нему у меня 2 вопроса:
1. зачем нужна переменная isRunning, если она не используется
2. что подразумевается под  Unique name1 и Unique name2? первое - наверное имя программы, количество запусков которой я хочу контролировать, а Unique name2?

в этой же статье прочитал, что "если в результате аварийного завершения предыдущего экземпляра приложения осталась неразруженая разделяемая память с нулевым (фактически) счетчиком ссылок подсоединение к ней и немедленное отсоединение разрушит эту память. А если счетчик ссылок ненулевой — он останется прежним."

поэтому в свой пример (в самом начале темы) после создания экземпляра sharedMemory делаю
Код

sharedMemory.attach();
sharedMemory.detach();
...

тогда вроде бы все работает, но не совсем мне понятно почему - т.е. attach-detach убивает ранее созданную память, но это надо бы делать после выхода (любого) из программы, но где это писать при аварийном выходе - непонятно... 
PM MAIL   Вверх
Majestio
Дата 10.12.2013, 22:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 83
Регистрация: 19.12.2010

Репутация: нет
Всего: нет



К сожалению, пока нет времени разбираться, хотя вопрос достаточно интересен.
Бегло глянул инфу в сети, и нашел, на мой взгляд интересные статьи.
Надеюсь помогут:

1) О команде просмотра всех объектов System V IPC, и не только - тырк здесь
2) Знакомство с межпроцессным взаимодействием на Linux - тырк здесь

Конечно просьба: как появится законченное решение - опубликовать его с комментариями тут  smile 

ЗЫ: Ну и пожелание ... раз уж речь ведем о кросспратворменной среде разработки - предусмотреть реализацию и для Win & Mac, по возможности. Если что, готов потестить.
PM MAIL WWW   Вверх
bsa
Дата 11.12.2013, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 24
Всего: 196



Я не понял, а чем не нравится вариант с QtSingleApplication? Там уже все сделано и отлажено! Достаточно скопировать себе несколько файликов из архива.
PM   Вверх
gordmiand
Дата 11.12.2013, 21:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 772
Регистрация: 15.4.2007

Репутация: нет
Всего: 0



QtSingleApplication - класс может и хорош сам по себе, но таскать несколько "лишних" файлов не хочется...можно же решить такой вопрос и qt-ми средствами...например вариант с shared memory и семафором додумать до конца...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.1850 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.