Russian Qt Forum
Ноябрь 24, 2024, 10:31 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Запуск приложения из QT и завершение работы  (Прочитано 31240 раз)
Larrikin
Гость
« : Ноябрь 05, 2005, 20:01 »

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

Да, кстати, если я вставляю в свою прогу execl("filename",""), то при выполнении программа вываливается в корку.
Записан
Trolltux
Гость
« Ответ #2 : Ноябрь 05, 2005, 21:36 »

См. класс QProcess.
Записан
Larrikin
Гость
« Ответ #3 : Ноябрь 05, 2005, 22:00 »

Цитата: "Trolltux"
См. класс QProcess.

QProcess prog;
prog.start("myProg");
exit(0);
так? То есть код моего приложения заместится myProg?
Записан
Trolltux
Гость
« Ответ #4 : Ноябрь 05, 2005, 22:34 »

Читайте Assistant или man.
Там все расписано.

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

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

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

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

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

ИМХО, у TrollTech самая грамотные доки.
Записан
Larrikin
Гость
« Ответ #5 : Ноябрь 05, 2005, 22:40 »

Цитата: "Trolltux"
Читайте Assistant или man.
Там все расписано.

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

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

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

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

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

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

Понял, спасибо.
Записан
Sergeich
Гость
« Ответ #6 : Ноябрь 06, 2005, 11:44 »

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

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

Спасибо большое, то что нужно
Записан
Фёдор
Гость
« Ответ #8 : Июль 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() и всё. При запущенном процессе оно его останавливает, а при отсутсвии запущенных процессов, вылетает моё окно.
Записан
Grigory
Гость
« Ответ #9 : Июль 20, 2006, 14:58 »

у тебя proc==null
Записан
RankoR
Гость
« Ответ #10 : Май 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, которая должна сразу вернуть управление в скрипте, а запускаемое приложение - продолжить работу в бекграунде.

Спасибо.
Записан
RZX
Гость
« Ответ #11 : Август 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]
Записан
crossly
Гость
« Ответ #12 : Август 23, 2010, 14:31 »

Цитировать
если "Пуск"->"Выполнить"->cmd.exe
а в cmd записать: "c:\Program Files\Outlook Express\msimn.exe"
OE вываливается с ошибкой!
хотелось бы узнать с какой ошибкой...
Записан
RZX
Гость
« Ответ #13 : Август 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.
Записан
RZX
Гость
« Ответ #14 : Август 23, 2010, 16:24 »

Даже если просто оставить:

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

при выполнении ничего не происходит - никаких ошибок, просто без реакции.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.05 секунд. Запросов: 21.