Russian Qt Forum

Qt => Многопоточное программирование, процессы => Тема начата: interv от Январь 26, 2012, 15:08



Название: Обойтись без QtSingleApplication + Вопрос про QProcess
Отправлено: interv от Январь 26, 2012, 15:08
1. Как обойтись без QtSingleApplication, т.е. игнорировать второй запуск программы. т.к. он зачемто использует QNetwork.
2. Как запустить QProcess, и чтобы он не убивал его при закрытии приложения, QProcess::startDetached не подходит, т.к. надо запоминать запущенные процессы.


Название: Re: Обойтись без QtSingleApplication + Вопрос про QProcess
Отправлено: interv от Январь 27, 2012, 13:24
1. Решение
Код
C
...
#include <windows.h>
...
 
int main(int argc, char *argv[])
{
 QApplication a(argc, argv);
 QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));
 QString uniqueNameMutex("--==##UNIQUE-MUTEX##==--");
 HANDLE mut = CreateMutex(0, false, uniqueNameMutex.toStdWString().c_str());
 DWORD lastError = GetLastError();
 if ((mut==0) || (lastError == ERROR_ALREADY_EXISTS))
 {
   QMessageBox msgBox;
   msgBox.setText(QObject::tr("Program already run."));
   msgBox.setStandardButtons(QMessageBox::Ok);
   msgBox.setDefaultButton(QMessageBox::Ok);
   msgBox.show();
   return a.exec();
 }
 Widget w;
 w.hide();
 return a.exec();
}
2. Вопрос еще актуален.


Название: Re: Обойтись без QtSingleApplication + Вопрос про QProcess
Отправлено: Пантер от Январь 27, 2012, 13:26
1. А как же другие платформы? ;)


Название: Re: Обойтись без QtSingleApplication + Вопрос про QProcess
Отправлено: interv от Январь 27, 2012, 13:47
Эх дурья моя бошка! Условие - платформа Windows.


Название: Re: Обойтись без QtSingleApplication + Вопрос про QProcess
Отправлено: KrupaKarlo от Январь 27, 2012, 14:31
Самый простой вариант: закрепляешь за программой определенный порт. При запуске биндишь его. Если программа запускается она пытается этот порт забиндить. Если он уже занят, то уже есть запущенная программа Вот и все


Название: Re: Обойтись без QtSingleApplication + Вопрос про QProcess
Отправлено: Igors от Январь 27, 2012, 14:31
Эх дурья моя бошка! Условие - платформа Windows.
Неясно зачем обходиться, в нативняке там совсем несладко
http://www.prog.org.ru/index.php?topic=11139.msg68219#msg68219 (http://www.prog.org.ru/index.php?topic=11139.msg68219#msg68219)
Пользуйтесь поиском


Название: Re: Обойтись без QtSingleApplication + Вопрос про QProcess
Отправлено: interv от Январь 30, 2012, 09:25
Всем спасибо, а что с QProcess посоветуете, мне просто надо знать какие прилаги я запустил и еще пока не закрыл.
Но вот в чем проблемма при закрытии моего приложения оно убивает все процессы которые запустило...


Название: Re: Обойтись без QtSingleApplication + Вопрос про QProcess
Отправлено: KrupaKarlo от Январь 30, 2012, 11:14
Возможно дело в том, что когда вызывается деструктор QProcess он грохает прилагу. И если ты в конструкторе QProcess указал this или вообще парента то QProcess удалится. Надо создавать его без парента.


Название: Re: Обойтись без QtSingleApplication + Вопрос про QProcess
Отправлено: interv от Январь 30, 2012, 12:14
Действительно!
Решение:
Код
C
 QProcess *process = new QProcess(0);
 process->start(exePath, QIODevice::ReadOnly);
 connect(process, SIGNAL(finished(int)), process, SLOT(deleteLater()));


Название: Re: Обойтись без QtSingleApplication + Вопрос про QProcess
Отправлено: LisandreL от Январь 30, 2012, 14:44
Как вариант QSharedMemory с его локом.
Ну или QLockedFile.
Но если действительно нужна только винда, то наверно проще писать на дот нэте использовать системный мьютекс.


Название: Re: Обойтись без QtSingleApplication + Вопрос про QProcess
Отправлено: KrupaKarlo от Январь 30, 2012, 15:05
Новичкам свойственно ошибаться  :)


Название: Re: Обойтись без QtSingleApplication + Вопрос про QProcess
Отправлено: Igors от Январь 30, 2012, 15:34
Новичкам свойственно ошибаться  :)
Но, увы, это проходит  :'(