Russian Qt Forum

Qt => Общие вопросы => Тема начата: Larrikin от Ноябрь 05, 2005, 20:01



Название: Запуск приложения из QT и завершение работы
Отправлено: Larrikin от Ноябрь 05, 2005, 20:01
Здравствуйте.
Нужно из приложения на QT вызвать программу и завершить работу.
Хмм.. как то непонятно получилось.
Вобщем нужно что то типа сишного execl("filename","");


Название: Запуск приложения из QT и завершение работы
Отправлено: Larrikin от Ноябрь 05, 2005, 20:03
Да, кстати, если я вставляю в свою прогу execl("filename",""), то при выполнении программа вываливается в корку.


Название: Запуск приложения из QT и завершение работы
Отправлено: Trolltux от Ноябрь 05, 2005, 21:36
См. класс QProcess.


Название: Запуск приложения из QT и завершение работы
Отправлено: Larrikin от Ноябрь 05, 2005, 22:00
Цитата: "Trolltux"
См. класс QProcess.

QProcess prog;
prog.start("myProg");
exit(0);
так? То есть код моего приложения заместится myProg?


Название: Запуск приложения из QT и завершение работы
Отправлено: Trolltux от Ноябрь 05, 2005, 22:34
Читайте Assistant или man.
Там все расписано.

Ничей код не будет меняться.
Вызовется внешняя программа.

QT4:
QProcess proc;
proc.start("программа", "аргументы");

QT3:
QProcess proc;
proc.addArgument("программа");
proc.addArgument("аргументы");
proc.start();

На счет третьего QT не уверен.

Не бойтесь читать документацию.
Там все на примерах расписано.

ИМХО, у TrollTech самая грамотные доки.


Название: Запуск приложения из QT и завершение работы
Отправлено: Larrikin от Ноябрь 05, 2005, 22:40
Цитата: "Trolltux"
Читайте Assistant или man.
Там все расписано.

Ничей код не будет меняться.
Вызовется внешняя программа.

QT4:
QProcess proc;
proc.start("программа", "аргументы");

QT3:
QProcess proc;
proc.addArgument("программа");
proc.addArgument("аргументы");
proc.start();

На счет третьего QT не уверен.

Не бойтесь читать документацию.
Там все на примерах расписано.

ИМХО, у TrollTech самая грамотные доки.

Понял, спасибо.


Название: Запуск приложения из QT и завершение работы
Отправлено: Sergeich от Ноябрь 06, 2005, 11:44
Как я понял, тебе надо запустить процесс из программы и тут же ее завершить и все это должно работать под Unix. Если ты работаешь с 4-кой тебе надо юзать QProcess::startDetached, чтобы запущенный процесс не завершился после завершения программы, под 3-кой придется писать это дело самому, лучше всего выдрать кусок кода для QProcess из сырцов 4-ки.


Название: Запуск приложения из QT и завершение работы
Отправлено: Larrikin от Ноябрь 06, 2005, 12:17
Цитата: "Sergeich"
Как я понял, тебе надо запустить процесс из программы и тут же ее завершить и все это должно работать под Unix. Если ты работаешь с 4-кой тебе надо юзать QProcess::startDetached, чтобы запущенный процесс не завершился после завершения программы, под 3-кой придется писать это дело самому, лучше всего выдрать кусок кода для QProcess из сырцов 4-ки.

Спасибо большое, то что нужно


Название: Запуск приложения из QT и завершение работы
Отправлено: Фёдор от Июль 10, 2006, 15:35
Добрый день! Имею qt3 у себя в linux SUSE 9.2.
Плотно начал заниматься програмированием не очень давно.
У меня возникла проблема.
Моё оконное приложение может запускать, внешние файлы, их работа достаточно долгая. Выход с stderr и stdout идёт в отдельное поле textEdit. Иногда при выключенных приборах, получается так что запустив эту внешнюю программу, совершается долгая холостая работа(это можно видеть по stdout). И я сделал кнопочку, которая должна убивать процесс. Но тут и умер.
QProcess *proc;
Потом в SLOT отдельных связанных с кнопками я делал нечто вроде

formPostControl::text()
{
proc=new QProcess(this);
......//вставлял сюда аргументы и т д делал нужные connect и приложение работало замечательно.
}

//а при переходе к SLOT убивающему процесс
formPostControl::stopProc()
{
if(proc->isRunning())
{
proc->tryTerminate();
QTimer::singleShot( 5000, proc, SLOT( kill() ) );
}
else
{
textEditWorkingMess->setText(QString::fromLocal8Bit("Работающих процессов нет"))
}
}

При компиляции проскакивает нормально. А при нажатии на кнопку в окне(заведомо зная что процесс щас не запущен) происходит вылет и говорится segmentation fault. Всё дело в proc->isRunning(). Что здесь неправильно? Я пробовал просто без if взять tryTerminate() и всё. При запущенном процессе оно его останавливает, а при отсутсвии запущенных процессов, вылетает моё окно.


Название: Запуск приложения из QT и завершение работы
Отправлено: Grigory от Июль 20, 2006, 14:58
у тебя proc==null


Название: Re: Запуск приложения из QT и завершение работы
Отправлено: RankoR от Май 28, 2010, 23:17
Здравствуйте! Задача похожая - запустить приложение и завершить свою работу. Запускаемое приложение работает достаточно долго (тоже на Qt), поэтому используется запускающее в качестве посредника. Вот код запускающего приложения:

Код:
int main(int argc, char *argv[])
{
    QProcess process;
    process.startDetached(argv[1]);
    sleep(1);
    return 0;
}

В Windows все работает без проблем. В линуксе при запуске запускающего из консоли управление не возвращается до завершения запускаемого. Т.е. он выглядит примерно так:

Код:
./start "start2 arg1 arg2"
<Вывод запускаемого>
<Еще Вывод запускаемого>
<Еще Вывод запускаемого>
rankor@ubuntu:

Собственно, как мне нужно переписать свой код, чтобы управление возвращалось моментально?
P.S. Суть в том, что запускающее приложение стартуется из PHP функцией exec, которая должна сразу вернуть управление в скрипте, а запускаемое приложение - продолжить работу в бекграунде.

Спасибо.


Название: Re: Запуск приложения из QT и завершение работы
Отправлено: RZX от Август 23, 2010, 14:02
Еще раз про QProcess в Windows...

Есть программа на Qt, которая управляет фильтрами в Outlook Express 6.0 (OE).
Вопрос в том, что эта программа для применения параметров должна запускать OE и через некоторое время завершать его работу.

Вот такая фишка:
QProcess *outlookExpressProcess = new QProcess(this);
outlookExpressProcess->start(...);
outlookExpressProcess->waitForStarted(...);
outlookExpressProcess->kill();

не прокатывает!

Объясню почему:
запуск OE можно произвести командой msimn.exe
причем если "Пуск"->"Выполнить"->"c:\Program Files\Outlook Express\msimn.exe" - все прекрасно работает

если "Пуск"->"Выполнить"->cmd.exe
а в cmd записать: "c:\Program Files\Outlook Express\msimn.exe"
OE вываливается с ошибкой!

[offtop]
Хотя какая ему разница?????
calc, MS Word, MS Excel нормально запускаются и там, и там!
А эта с*ка не хочет ни в какую!
[/offtop]

Так как outlookExpressProcess->start(...) аналогичен вызову в cmd - в программе ничего не происходит.

Часть 1 вопроса: Может где-то я не прав?

Однако если из этой же программы вызвать

QDir::setCurrent("C:\\Program Files\\Outlook Express");
QProcess::startDetached("msimn.exe");

тоже замечательно все запускается!

Часть 2 вопроса: Если запускать процесс через startDetached(), как завершить его через определенное время из запускающей программы?

[offtop]
Ну вот как например в Delphi:

h:= openprocess(PROCESS_TERMINATE, false, PID)
terminateprocess(h,0);
[/offtop]


Название: Re: Запуск приложения из QT и завершение работы
Отправлено: crossly от Август 23, 2010, 14:31
Цитировать
если "Пуск"->"Выполнить"->cmd.exe
а в cmd записать: "c:\Program Files\Outlook Express\msimn.exe"
OE вываливается с ошибкой!
хотелось бы узнать с какой ошибкой...


Название: Re: Запуск приложения из QT и завершение работы
Отправлено: RZX от Август 23, 2010, 15:42
Н-да... Попробовал на другом компе (виртуальная машина с чистой WinXP SP2):

QDir::setCurrent("C:\\Program Files\\Outlook Express");
QProcess::startDetached("msimn.exe");

эти команды нормально запускают OE.

QProcess *outlookExpressProcess = new QProcess(this);
outlookExpressProcess->start(...);
outlookExpressProcess->waitForStarted(...);
outlookExpressProcess->kill();

если компилить вот с этим, то моя программа НЕ запускает OE, а вываливается с ошибкой (окно "Отправить отчет об ошибке?")

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

хотелось бы узнать с какой ошибкой...

Оййй... видимо, это кони уже самого Outlook'а. Потому как в чистой винде
если "Пуск"->"Выполнить"->cmd.exe
а в cmd записать: "c:\Program Files\Outlook Express\msimn.exe"
то OE нормально запускается.

а так ошибки (наверное, это уже не суть важно):

>> Не удается запустить программу Outlook Express. Приложению не удалось открыть банк сообщений Outlook Express. Возможно, компьютеру не хватает памяти или переполнен жесткий диск. Обратитесь в службу поддержки пользователей корпорации Майкрософт для получения помощи. (0x8007007E, 126)

После нажатия Ok:
>>Не удается запустить программу Outlook Express. Библиотека MSOE.dll не инициализируется. Возможные причины - неправильная установка приложения Outlook Express.


Название: Re: Запуск приложения из QT и завершение работы
Отправлено: RZX от Август 23, 2010, 16:24
Даже если просто оставить:

QProcess *outlookExpressProcess = new QProcess(this);
outlookExpressProcess->setWorkingDirectory("C:\\Program Files\\Outlook Express");
outlookExpressProcess->start("msimn.exe");

при выполнении ничего не происходит - никаких ошибок, просто без реакции.


Название: Re: Запуск приложения из QT и завершение работы
Отправлено: crossly от Август 24, 2010, 10:13
может дело в окружении....


Название: Re: Запуск приложения из QT и завершение работы
Отправлено: RZX от Август 24, 2010, 14:23
может дело в окружении....

Может быть, но хез что ему там надо..
В принципе в соседней ветке ответили:
http://www.prog.org.ru/index.php?topic=11886.msg96076#new (http://www.prog.org.ru/index.php?topic=11886.msg96076#new)
это можно грохнуть процесс, если запускать его через startDetached().