Как запускать приложения из своей программы ?
Модератор: Модераторы разделов
-
zayac_val
- Сообщения: 38
- ОС: openSuse10.3
Как запускать приложения из своей программы ?
В MFC есть функция ShellExecute(...), с помощью которой можно запускать из программы любое приложение, я написал програмульку в KDevelop и все чего не хватает это аналога ShellExecute(...) в KDevelop т.е. в Qt. Помогите пожалуйста, бо умираю .
-
allez
- Сообщения: 2223
- Статус: Не очень злой админ :-)
- ОС: SuSE, CentOS, FreeBSD, Windows
Re: Как запускать приложения из своей программы ?
Возможно, скажу глупость, поэтому прошу не судить строго, но не подойдет ли вам в данном случае функция system()?
-
serzh-z
- Бывший модератор
- Сообщения: 8259
- Статус: Маньяк
- ОС: Arch, Fedora, Ubuntu
Re: Как запускать приложения из своей программы ?
zayac_val
Если приложение линкуется с библиотеками KDE, то можно использовать KRun, который является частью библиотеки kio.
Если приложение линкуется с библиотеками KDE, то можно использовать KRun, который является частью библиотеки kio.
-
zayac_val
- Сообщения: 38
- ОС: openSuse10.3
Re: Как запускать приложения из своей программы ?
В KDevelop я новичок, при созданеи проекта выбирал "Простое приложение KDE" , я так понимаю это значит, что моя прога линкуется с библиотеками KDE ?
А в Qt нет какого-то метода ?
-
serzh-z
- Бывший модератор
- Сообщения: 8259
- Статус: Маньяк
- ОС: Arch, Fedora, Ubuntu
-
MiK13
- Сообщения: 1292
- ОС: Linux Debian
Re: Как запускать приложения из своей программы ?
У меня тоже возник аналогичный вопрос.
Но, с другой стороны, недостаток system(...) -- она, по-моему, будет ждать завершения выполнения команды.
Поэтому, наверно, лучше использовать что-то типа if(!fork()) exec.... Правда, при этом, чтобы не было зомби, надо ловить сигнал SIGCHLD и выдавать wait.
Или, может быть эта технология в иксах не применима?
-
ssh
- Сообщения: 78
- ОС: Debian
Re: Как запускать приложения из своей программы ?
Раз программа на Qt, то всего логичнее использовать QProcess. Бог с ними, с mime-типами, зато можно автоматически реализовать двусторонний обмен данными с потомком, используя его стандартные потоки.
system, действительно, ждет завершения потомка; если это нежелательно, то можно посмотреть в сторону spawn - там был какой-то вариант с флагом NOWAIT, что ли. В том и другом случаях взаимодействие программ организовать сложно, разве что через файловую систему, ну, или придется конвейеры какие-то организовывать,
А с fork'ом имеет смысл связываться только в самом крайнем случае - если, например, надо породить демона, который будет работать совершенно автономно от родителя и каких-либо консолей.
system, действительно, ждет завершения потомка; если это нежелательно, то можно посмотреть в сторону spawn - там был какой-то вариант с флагом NOWAIT, что ли. В том и другом случаях взаимодействие программ организовать сложно, разве что через файловую систему, ну, или придется конвейеры какие-то организовывать,
А с fork'ом имеет смысл связываться только в самом крайнем случае - если, например, надо породить демона, который будет работать совершенно автономно от родителя и каких-либо консолей.
-
un-defined
- Сообщения: 145
- ОС: Kubuntu, Gentoo
Re: Как запускать приложения из своей программы ?
Чем же так fork/exec не угодил-то... уж куда ж стандартнее-то..
Don`t try - just do or do not ©Master Joda
-
MiK13
- Сообщения: 1292
- ОС: Linux Debian
Re: Как запускать приложения из своей программы ?
Я с общими файлами работал в DOS и Windows и не скажу, что тут есть какие-то особые сложности.
В Linux предпочитаю использовать разделяемую памяти, а также очереди сообщений. Можно и сигналы посылать.
-
ssh
- Сообщения: 78
- ОС: Debian
Re: Как запускать приложения из своей программы ?
un-defined писал(а): ↑09.05.2008 00:31Чем же так fork/exec не угодил-то... уж куда ж стандартнее-то..
Неудобством в управлении потомком - тут уже упоминалась необходимость посылки каких-то сигналов. Кроме того, вроде бы речь шла о запуске произвольной программы, а не копии выполняемого процесса.
Что касается файлов, разделяемой памяти и т.п. - все это замечательно, но придется беспокоиться о синхронизации доступа, создавать семафоры... А вот QProcess, как, собственно, и вся Qt, предлагает очень изящное и надежно работающее решение.
-
RasenHerz
- Сообщения: 1341
- ОС: Arch Linux amd64
Re: Как запускать приложения из своей программы ?
ssh писал(а): ↑09.05.2008 11:26un-defined писал(а): ↑09.05.2008 00:31Чем же так fork/exec не угодил-то... уж куда ж стандартнее-то..
Неудобством в управлении потомком - тут уже упоминалась необходимость посылки каких-то сигналов. Кроме того, вроде бы речь шла о запуске произвольной программы, а не копии выполняемого процесса.
Что касается файлов, разделяемой памяти и т.п. - все это замечательно, но придется беспокоиться о синхронизации доступа, создавать семафоры... А вот QProcess, как, собственно, и вся Qt, предлагает очень изящное и надежно работающее решение.
во-первых, что-то я не понял - речь ведь идет о запуске произвольной программы, тогда о каком упралении можно говорить как не об управлении через сигналы(если иное не предусмотрено, к примеру, запускаемая программа слушает порт и ожидает комманд из вне)? во-вторых, чтобы создать процесс и незаместить свой собственный, программа должна сделать вызв fork(), при этом не будет создаваться вся копия родительского процесса(copy-on-write) и при необходимости сделать exec(), который замещает вызвавший процесс(в данном случае порожденный) и загружает в него другой исполняемый файл; после этого возможно лишь управление процессом через сигналы или другим ПРЕДУСМОТРЕННЫМ в родительском и дочернем процессе способом. не думаю что Trolltech нашли иное решение, так что если я в QProcess загружу программу управлять которой можно только через сигналы, то управлять ей можно будет(без хирургического вмешательства) только через сигналы.. просто вся реализация скрыта под километровым слоем классов.
-
un-defined
- Сообщения: 145
- ОС: Kubuntu, Gentoo
Re: Как запускать приложения из своей программы ?
Не каких-то, а SIGCHLD, и не посылка, а как раз наоборот, прием
Насчет запуска произвольной программы, а не копии - посмотрите повнимательней на функции семейства exec.
К слову, system работает тоже через fork/exec, но запускает не програму, а shell, а уже в shell - программу. Да и в шелле программа запускается все тем же способом. Т.е. два процесса создается фактически, и время расходуется соответственно больше.
Специально залез в исходники QProcess за подтверждением - угадайте, каким образом они запускают новый процесс?
Согласен в одном - если приложение Qt, то надо пользоваться возможностями Qt. Но изначально вопрос был про KDevelop. Кстати почему-то автор поставил знак равенства между KDevelop и Qt, что, разумеется, далеко не так.
RasenHerz писал(а): ↑09.05.2008 13:41во-первых, что-то я не понял - речь ведь идет о запуске произвольной программы, тогда о каком упралении можно говорить как не об управлении через сигналы(если иное не предусмотрено, к примеру, запускаемая программа слушает порт и ожидает комманд из вне)? во-вторых, чтобы создать процесс и незаместить свой собственный, программа должна сделать вызв fork(), при этом не будет создаваться вся копия родительского процесса(copy-on-write) и при необходимости сделать exec(), который замещает вызвавший процесс(в данном случае порожденный) и загружает в него другой исполняемый файл; после этого возможно лишь управление процессом через сигналы или другим ПРЕДУСМОТРЕННЫМ в родительском и дочернем процессе способом. не думаю что Trolltech нашли иное решение, так что если я в QProcess загружу программу управлять которой можно только через сигналы, то управлять ей можно будет(без хирургического вмешательства) только через сигналы.. просто вся реализация скрыта под километровым слоем классов.
Ну внутри QProcess делается канал, чтобы родитель мог общаться с потомком через стандартные потоки ввода/вывода. Ну и SIGCHLD конечно. А спрятано это все очень глубоко, да..
Don`t try - just do or do not ©Master Joda
-
MiK13
- Сообщения: 1292
- ОС: Linux Debian
Re: Как запускать приложения из своей программы ?
un-defined писал(а): ↑09.05.2008 13:52Ну внутри QProcess делается канал, чтобы родитель мог общаться с потомком через стандартные потоки ввода/вывода. Ну и SIGCHLD конечно. А спрятано это все очень глубоко, да..
Подозреваю, что QProcess -- это просто реализация более высокого уровня процедур из стандартной библиотеки ввода/вывода popen и pclose:
Описание
#include <stdio.h>
FILE * popen(const char *comstring, const char *type);
int pclose(FILE *strm);
Как и процедура system, процедура popen создает дочерний процесс командного интерпретатора для запуска команды, заданной параметром comstring. Но, в отличие от процедуры system, она также создает канал между вызывающим процессом и командой, а затем возвращает структуру FILE, связанную с этим каналом. Если значение параметра type равно w, то программа может выполнять запись в стандартный ввод при помощи структуры FILE. Если же значение параметра type равно r, то программа сможет выполнять чтение из стандартного вывода программы. Таким образом, процедура popen представляет простой и понятный метод взаимодействия с другой программой.
Для закрытия потока, открытого при помощи процедуры popen, должна всегда использоваться процедура pclose. Она будет ожидать завершения команды, после чего вернет статус ее завершения.
-
un-defined
- Сообщения: 145
- ОС: Kubuntu, Gentoo
Re: Как запускать приложения из своей программы ?
MiK13 писал(а): ↑10.05.2008 02:09un-defined писал(а): ↑09.05.2008 13:52Ну внутри QProcess делается канал, чтобы родитель мог общаться с потомком через стандартные потоки ввода/вывода. Ну и SIGCHLD конечно. А спрятано это все очень глубоко, да..
Подозреваю, что QProcess -- это просто реализация более высокого уровня процедур из стандартной библиотеки ввода/вывода popen и pclose
Именно, только не popen/pclose, а проще - обычный pipe(2)
Don`t try - just do or do not ©Master Joda
-
vladimir_l
- Сообщения: 24
Re: Как запускать приложения из своей программы ?
А можнет быть кто-то знает как через QProcess запустить "rz < /dev/ttyS0 > /dev/ttyS0"
Через system("sz /111 > /dev/ttyS0 < /dev/ttyS0") и system("rz < /dev/ttyS0 > /dev/ttyS0") всё работает, но нельзя отследить результаты(какой файл был принят и куда, и принят(передан) ли вообще).
Через system("sz /111 > /dev/ttyS0 < /dev/ttyS0") и system("rz < /dev/ttyS0 > /dev/ttyS0") всё работает, но нельзя отследить результаты(какой файл был принят и куда, и принят(передан) ли вообще).
-
watashiwa_daredeska
- Бывший модератор
- Сообщения: 4038
- Статус: Искусственный интеллект (pre-alpha)
- ОС: Debian GNU/Linux
Re: Как запускать приложения из своей программы ?
vladimir_l писал(а): ↑10.10.2008 12:42А можнет быть кто-то знает как через QProcess запустить "rz < /dev/ttyS0 > /dev/ttyS0"
Собственно, с QProcess не работал, но рискну предположить, что можно делать по аналогии с system(): запускать $SHELL -c 'command'.
Мои розовые очки
-
vladimir_l
- Сообщения: 24
-
watashiwa_daredeska
- Бывший модератор
- Сообщения: 4038
- Статус: Искусственный интеллект (pre-alpha)
- ОС: Debian GNU/Linux
Re: Как запускать приложения из своей программы ?
Например, /bin/sh -c 'rz < /dev/ttyS0 > /dev/ttyS0'
Как запускать такую команду средствами QProcess пусть ответят те, кто этот QProcess хотя бы в глаза видели
Мои розовые очки
-
vladimir_l
- Сообщения: 24
Re: Как запускать приложения из своей программы ?
watashiwa_daredeska писал(а): ↑10.10.2008 16:31
Например, /bin/sh -c 'rz < /dev/ttyS0 > /dev/ttyS0'
Как запускать такую команду средствами QProcess пусть ответят те, кто этот QProcess хотя бы в глаза видели
Поместил эту команду в QProcess, все работает. Только вывод, почему-то, идет в обработчик ошибок readyReadStderr()
Код: Выделить всё
Proc=new QProcess(QString("sh"));//this);
Proc->addArgument("-c");
Proc->addArgument("''rz -b -E < /dev/ttyS0 > /dev/ttyS0''");
connect(Proc,SIGNAL(readyReadStderr()),this,SLOT(readErrProc()));
connect(Proc,SIGNAL(readyReadStdout()),this,SLOT(readOutProc()));
if(Proc->start()) cout<<"Процесс запущен"<<endl;