Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Вопрос по вызову QProcess ?
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Общие вопросы
AntonTatu
Всем привет!

Возникла необходимость вызывать из одной программы другую, вот такой код не работает, как правильно ?

QProcess myProc;
myProc.start ("C:\1.exe");
Litkevich Yuriy
Цитата(AntonTatu @ 16.3.2009, 15:07) *
\1
слэш в языке С++ имеет специальный смысл, либо пиши
C:/1.exe
либо
C:\\1.exe
AntonTatu
Цитата(Litkevich Yuriy @ 16.3.2009, 12:08) *
Цитата(AntonTatu @ 16.3.2009, 15:07) *
\1
слэш в языке С++ имеет специальный смысл, либо пиши
C:/1.exe
либо
C:\\1.exe


да как я уже только не писал :(
kwisp
Цитата(AntonTatu @ 16.3.2009, 12:27) *
да как я уже только не писал

ну там же в классе есть куча всего, вывод ошибок, проверка в каком состоянии процесс. при старте объект высылает сигнал о старте. результатт всего этого какой???
есть статические функции запуска программ.
проверял??? смотрел???

на форуме есть темы по QProcess.
BRE
Цитата(AntonTatu @ 16.3.2009, 12:27) *
да как я уже только не писал :(

А что пишет? Что QProcess::error() возвращает?

А ты случаем не так вызываешь?
void func()
{
    QProcess myProc;
    myProc.start ("C:\1.exe");
}


А то при выходе из функции, процесс 1.exe будет убит, не успев запуститься.
AntonTatu
Цитата(BRE @ 16.3.2009, 12:38) *
Цитата(AntonTatu @ 16.3.2009, 12:27) *
да как я уже только не писал :(

А что пишет? Что QProcess::error() возвращает?

А ты случаем не так вызываешь?
void func()
{
    QProcess myProc;
    myProc.start ("C:\1.exe");
}


А то при выходе из функции, процесс 1.exe будет убит, не успев запуститься.


ну вобщем да.... , а как же мне его тогда вызывать ?
BRE
Цитата(AntonTatu @ 16.3.2009, 13:15) *
ну вобщем да.... , а как же мне его тогда вызывать ?

А ты QProcess не на стеке создавай:
QProcess *p = new QProcess(...);
p->start( ... );

Только после завершения процесса, не забывай объект удалить.

или, если надо, дожидайся завершения процесса в функции:

bool QProcess::waitForFinished ( int msecs = 30000 )

void func()
{
    QProcess myProc;
    myProc.start ("C:\1.exe");
    myProc.waitForFinished();
}
AntonTatu
Цитата(BRE @ 16.3.2009, 13:21) *
Только после завершения процесса, не забывай объект удалить.
или, если надо, дожидайся завершения процесса в функции:
bool QProcess::waitForFinished ( int msecs = 30000 )
void func()
{
    QProcess myProc;
    myProc.start ("C:\1.exe");
    myProc.waitForFinished();
}


в общем копался копался докапался:
QProcess myProc;
QStringList Arg;
Arg << "/c mybat.bat";
myProc.startDetached("cmd.exe",Arg,Catalog); //запускаю батник в нужной папке через cmd.exe
myProc.waitForFinished();


только почему то задержка myProc.waitForFinished(); не работает... почему ?
BRE
Цитата(AntonTatu @ 16.3.2009, 16:24) *
в общем копался копался докапался:
QProcess myProc;
QStringList Arg;
Arg << "/c mybat.bat";
myProc.startDetached("cmd.exe",Arg,Catalog); //запускаю батник в нужной папке через cmd.exe
myProc.waitForFinished();


только почему то задержка myProc.waitForFinished(); не работает... почему ?

Что значит не работает, сразу выходит?
Так это потому, что ты процесс отделяешь (detach).
После выполнения myProc.startDetached процесс начинает жить своей жизнью. Даже если ты закроешь программу запустившую процесс, процесс будет работать дальше.
Для таких процессов можно не ждать его завершения.
Litkevich Yuriy
BRE, AntonTatu, не цитируйте целыми сообщениями, как цитировать по чуть-чуть написано здесь
DEADHUNT
arg = QStringList() << "/c" << "console_runner.bat" << "calc.exe";
projectProcess->start("cmd.exe", arg);

console_runner.bat:
%*
pause

calc.exe запускается, но консоль не отображется.
может кто знает в чём дело?

консоль показывается если только использовать QProcess::startDetached
kwisp
DEADHUNT,
а почему должна оставаться?
"console_runner.bat"
закончил работу,
ключ /c -- последующее завершение сеанса.
попробуй в командной строке набрать то что в программе должно выполниться.

извиняюсь не прав .
сейчас попробовал, остается командная строка.
хм...
DEADHUNT
работа не была завершенна, в скрипте же есть pause в конце.
kwisp
почему не хочешь так?
arg = QStringList() << "calc.exe";
projectProcess->start("console_runner.bat", arg);
DEADHUNT
также работает(calc запускается), но консоль не показывается. например вместо calc надо ping запустить, но консоли нет и результатов не видно.
kwisp
DEADHUNT,
мож настройки винды такие.
а примерчика компилируемого нет?
DEADHUNT
примерчик очень большой(не один десяток файлов), судя по гуглу Qt так работает, сам можешь скомпилировать минимальный код который я написал выше и всё увидишь.
QProcess::start не показывает консоль
QProcess::startDetached показывает (static class member).
но надо также отлавливать завершение процесса или вручную завершить процесс, поэтому второй вариант не подходит.

смысл всего этого кода сделать что то типа загрузчика програм(в идеале как в VS Start Without Debug).
kwisp
DEADHUNT,
да start запускает консоль(в процессах видно), но скрывает её,
а видно консоль только если её отделить сразу же от процесса, а если отделлить то сигнала о завершении не получить.
:(
DEADHUNT
выход только WinAPI и условную компиляцию использовать? в линуксе отлично xterm работает.
Litkevich Yuriy
DEADHUNT, командная строка может захлопнутся, если программа вызываемая в батнике вернёт не нуль.

П.С. сам на такое наталкивался при выборочной компиляции Qt и вот к такому выводу пришёл.
kwisp
DEADHUNT,
я запустил так
QStringList s;
proc.start("bat.bat",s);

файл bat.bat
start cmd

сигнал о завершении работы приходит.
DEADHUNT
спасибо, но всётаки интересно как же тогда VS делает терминал через AllocConsole, или тоже какойто скрипт запускает?
а может проблему с завершением программы решить так progname || 1, только тогда вывод не красивый получается.
kwisp
это тебе надо к знатокам винды:)
сомневаюсь, это наверное особенность Qt.
можно у разарботчиков поинтересоваться,
отправив баг репорт.
баг это или нет не знаю но ответить они могут.
DEADHUNT
Цитата(kwisp @ 3.10.2009, 19:58) *
баг это или нет не знаю но ответить они могут.

да нет не баг, в интернете есть подобные темы, включая на trolltech например
http://lists.trolltech.com/qt-interest/200...ead01065-0.html
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2025 IPS, Inc.