Поиск:

Ответ в темуСоздание новой темы Создание опроса
> (QT3) Запуск двух экземпляров программы, как сделать запрет такого запуска 
:(
    Опции темы
ViLena
Дата 4.12.2008, 11:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Помогите, кто знает, как мне сделать запрет запуска двух экземпляров одной программы в QT3(Linux).

Когда вызываешь одну программу из другой, то можно использовать Mutexы, так я делала в Visual Studio ( Windows ). А если просто запретить двойной вызов программы, то как это сделать в QT3 и под Linux?  smile 
PM MAIL   Вверх
Elfebet
Дата 4.12.2008, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 545
Регистрация: 15.5.2006
Где: Украина. Запорожь е.

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



ну в QT тоже есть мьютексы - QMutex


--------------------
Программист не должен всё знать... он должен знать где можно посмотреть
PM MAIL ICQ GTalk   Вверх
ViLena
Дата 4.12.2008, 11:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



я знаю, я же говорю, что понимаю как отследить запуск копий программ при вызове одной из другой, а если просто в среде я вызываю программу, работаю с ней, а потом еще раз вызываю эту же программу, как этого не допустить? может в примере кто объяснит  smile 
PM MAIL   Вверх
Elfebet
Дата 4.12.2008, 12:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 545
Регистрация: 15.5.2006
Где: Украина. Запорожь е.

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



в какой среде? каким способом Вы ее запускаете? через QProcess?


--------------------
Программист не должен всё знать... он должен знать где можно посмотреть
PM MAIL ICQ GTalk   Вверх
SABROG
Дата 4.12.2008, 12:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


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

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



Я нашел такие методы:

- проверка PID, Lockfile's
- проверка открытого специфического порта на локалхосте
- использование QSharedMemory со своими подводными камнями

Возможно как-то еще можно использовать QSessionManager. При выходе из программы QSessionManager сохраняет id сессии и восстанавливает тот же номер при запуске. Если кто-то начал сессию, а потом запустилась вторая копия программы, то номера сессий уже не будут совпадать.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
Elfebet
Дата 4.12.2008, 12:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 545
Регистрация: 15.5.2006
Где: Украина. Запорожь е.

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



если я правильно понял то Вам нужно отследить состояние программы, запускаете ее через QProcess
в этом классе есть такие методы как 
 waitForFinished - ждать пока программа завершит свою работу
 state - определяет статус программы - не запущена, запускается, запущена 
и еще много чего вкусного
но это в Qt 4.3 есть, я не знаю как обстоят дела в Qt3  smile 


--------------------
Программист не должен всё знать... он должен знать где можно посмотреть
PM MAIL ICQ GTalk   Вверх
ViLena
Дата 4.12.2008, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



на данный момент мой main файл выглядит таким образом

Код

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

  LoginDlgImpl dlgLG;
  a.setMainWidget( &dlgLG );
  dlgLG.exec();
  if( dlgLG.autho )
  {
    MainDlgImpl dlgMain;
    a.setMainWidget( &dlgMain );
    return dlgMain.exec();
  }

  return 0; 
}


просто из main я вызываю диалог, какой кусок этого кода мне нужно запустить как процесс, чтоб потом использовать те функции, о которых вы говорили ( waitForFinished ) и не приведет ли это к тому, что я смогу отследить именно в этом maine, что нельзя запускать еще один диалог MainDlgImpl, но ведь это не дает уверенности, что из среды( Linux) я не смогу запустить еще один процесс main. A мне как раз и нужно. чтоб на определенный момент времени в среде работал только один такой процесс main
PM MAIL   Вверх
Elfebet
Дата 4.12.2008, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 545
Регистрация: 15.5.2006
Где: Украина. Запорожь е.

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



так всетаки что это за среда? среда - это та программа которую вы пишите или что?
я думал в этой среде написать
Код

QProcces pr;
pr.start("вааша программа");
pr. waitForFinished ();
QMessageBox::information(this, 0, "Ваша программа завершилось");

но теперь понял что Вам не то нужно  smile 

Это сообщение отредактировал(а) Elfebet - 4.12.2008, 13:03


--------------------
Программист не должен всё знать... он должен знать где можно посмотреть
PM MAIL ICQ GTalk   Вверх
Elfebet
Дата 4.12.2008, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 545
Регистрация: 15.5.2006
Где: Украина. Запорожь е.

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



Вот тут есть тут хорошее описание по русски про QSessionManager, как раз то что тебе нада


--------------------
Программист не должен всё знать... он должен знать где можно посмотреть
PM MAIL ICQ GTalk   Вверх
ViLena
Дата 4.12.2008, 14:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата

так всетаки что это за среда? среда - это та программа которую вы пишите или что?


простите, может я неправильно выразилась, но под средой я имела в виду операционную систему, ну или в частном случае менеджер сеансов X11.

Цитата

про QSessionManager


я прочитала эту статью, очень симпатичная штучка smile , но это немного не то, что мне нужно, хотя из этой статьи я вынесла наиболее простой способ получения текущего состояния программы - это запись флага состояния в какой-нить промежуточный файл, и если в этом файле моя прога один раз отметилась, то по-второму разу ее можно не запускать smile)

но может есть более интересные решения  smile 

Это сообщение отредактировал(а) ViLena - 4.12.2008, 14:45
PM MAIL   Вверх
Acer
Дата 4.12.2008, 17:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 652
Регистрация: 5.9.2007
Где: UA::DN

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



Если я правильно понял, то можно попробовать сделать как в Eclipse... файлик .lock
При запуске приложения, если файл уже используется, то Error и Terminate, иначе открываем файл и блокируем его до завершения работы.

Добавлено через 2 минуты и 3 секунды
Цитата(ViLena @ 4.12.2008,  14:44)
это запись флага состояния в какой-нить промежуточный файл, и если в этом файле моя прога один раз отметилась, то по-второму разу ее можно не запускать smile)

но может есть более интересные решения  smile

Лучше не записывать в файл. Так как его можно отредактировать...
PM MAIL   Вверх
ViLena
Дата 4.12.2008, 17:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



вообщем, пока я сделала так

 
Код

 QString fileName = QDir::currentDirPath() + "/exists";
 QFile file( fileName );

 if( file.exists() )
   return 0;
 else
   file.open( IO_WriteOnly );

 KApplication a;

 LoginDlgImpl dlgLG;
 a.setMainWidget( &dlgLG );
 dlgLG.exec();
 if( dlgLG.autho )
 {
    MainDlgImpl dlgMain(0,"ARM");
    a.setMainWidget( &dlgMain );
    /*return*/ dlgMain.exec();
 }

  file.close();
  file.remove(); 

  return 0;


в принципе работает, но мне как - то не по душе, может будут еще варианты smile 

вот подумалось, если вдруг программа завершится некорректно, то не сможет подчистить за собой файл и уже в следующий раз для ее запуска прийдется этот файл удалять ручками, плохо это smile 

Это сообщение отредактировал(а) ViLena - 4.12.2008, 17:52
PM MAIL   Вверх
SABROG
Дата 4.12.2008, 18:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


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

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



Цитата(ViLena @  4.12.2008,  17:44 Найти цитируемый пост)
вот подумалось, если вдруг программа завершится некорректно, то не сможет подчистить за собой файл и уже в следующий раз для ее запуска прийдется этот файл удалять ручками, плохо это


Было такое у меня с Eclipse. Приходилось самому файлик удалять.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
Acer
Дата 4.12.2008, 18:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 652
Регистрация: 5.9.2007
Где: UA::DN

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



Вариант с файликом.. CRT, STL
Код

int main( void ){
    std::ofstream fl;
    if ( ::unlink( ".lock" ) != 0 ){
        return 0;
    }
    fl.open( ".lock", std::ios_base::binary );

    std::getchar();

    fl.close();

    return 0;
}

Если файлик используется и его нельзя удалить, значит приложение не запускается...
Вот только не знаю, как сделать так, чтобы файл нельзя было открывать и записывать туда что-либо во время работы программы.
PM MAIL   Вверх
Elfebet
Дата 4.12.2008, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 545
Регистрация: 15.5.2006
Где: Украина. Запорожь е.

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



кроме как QSessionManager, инного способа видимо нет
ну есть еще платформенно зависимый способ, smile т.е. под каждую ось посвоему написать, как для windows сделать - информации море, для линух - нада поискать


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

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

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


 




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


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

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