Полная версия этой страницы:
Вопрос по вызову QProcess ?
AntonTatu
16.3.2009, 12:07
Всем привет!
Возникла необходимость вызывать из одной программы другую, вот такой код не работает, как правильно ?
QProcess myProc;
myProc.start ("C:\1.exe");
Litkevich Yuriy
16.3.2009, 12:08
Цитата(AntonTatu @ 16.3.2009, 15:07)

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

Цитата(AntonTatu @ 16.3.2009, 15:07)

\1
слэш в языке С++ имеет специальный смысл, либо пиши
C:/1.exe
либо
C:\\1.exe
да как я уже только не писал
Цитата(AntonTatu @ 16.3.2009, 12:27)

да как я уже только не писал
ну там же в классе есть куча всего, вывод ошибок, проверка в каком состоянии процесс. при старте объект высылает сигнал о старте. результатт всего этого какой???
есть статические функции запуска программ.
проверял??? смотрел???
на форуме есть темы по QProcess.
Цитата(AntonTatu @ 16.3.2009, 12:27)

да как я уже только не писал

А что пишет? Что QProcess::error() возвращает?
А ты случаем не так вызываешь?
void func()
{
QProcess myProc;
myProc.start ("C:\1.exe");
}
А то при выходе из функции, процесс 1.exe будет убит, не успев запуститься.
AntonTatu
16.3.2009, 13:15
Цитата(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 будет убит, не успев запуститься.
ну вобщем да.... , а как же мне его тогда вызывать ?
Цитата(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
16.3.2009, 16:24
Цитата(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(); не работает... почему ?
Цитата(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
16.3.2009, 17:58
BRE,
AntonTatu, не цитируйте целыми сообщениями, как цитировать по чуть-чуть написано
здесь
DEADHUNT
3.10.2009, 17:28
arg = QStringList() << "/c" << "console_runner.bat" << "calc.exe";
projectProcess->start("cmd.exe", arg);
console_runner.bat:
%*
pause
calc.exe запускается, но консоль не отображется.
может кто знает в чём дело?
консоль показывается если только использовать QProcess::startDetached
DEADHUNT,
а почему должна оставаться?
"console_runner.bat"
закончил работу,
ключ /c -- последующее завершение сеанса.
попробуй в командной строке набрать то что в программе должно выполниться.
извиняюсь не прав .
сейчас попробовал, остается командная строка.
хм...
DEADHUNT
3.10.2009, 17:34
работа не была завершенна, в скрипте же есть pause в конце.
почему не хочешь так?
arg = QStringList() << "calc.exe";
projectProcess->start("console_runner.bat", arg);
DEADHUNT
3.10.2009, 17:45
также работает(calc запускается), но консоль не показывается. например вместо calc надо ping запустить, но консоли нет и результатов не видно.
DEADHUNT,
мож настройки винды такие.
а примерчика компилируемого нет?
DEADHUNT
3.10.2009, 18:10
примерчик очень большой(не один десяток файлов), судя по гуглу Qt так работает, сам можешь скомпилировать минимальный код который я написал выше и всё увидишь.
QProcess::start не показывает консоль
QProcess::startDetached показывает (static class member).
но надо также отлавливать завершение процесса или вручную завершить процесс, поэтому второй вариант не подходит.
смысл всего этого кода сделать что то типа загрузчика програм(в идеале как в VS Start Without Debug).
DEADHUNT,
да start запускает консоль(в процессах видно), но скрывает её,
а видно консоль только если её отделить сразу же от процесса, а если отделлить то сигнала о завершении не получить.
DEADHUNT
3.10.2009, 18:19
выход только WinAPI и условную компиляцию использовать? в линуксе отлично xterm работает.
Litkevich Yuriy
3.10.2009, 18:43
DEADHUNT, командная строка может захлопнутся, если программа вызываемая в батнике вернёт не нуль.
П.С. сам на такое наталкивался при выборочной компиляции Qt и вот к такому выводу пришёл.
DEADHUNT,
я запустил так
QStringList s;
proc.start("bat.bat",s);
файл bat.bat
start cmd
сигнал о завершении работы приходит.
DEADHUNT
3.10.2009, 18:54
спасибо, но всётаки интересно как же тогда VS делает терминал через AllocConsole, или тоже какойто скрипт запускает?
а может проблему с завершением программы решить так progname || 1, только тогда вывод не красивый получается.
это тебе надо к знатокам винды:)
сомневаюсь, это наверное особенность Qt.
можно у разарботчиков поинтересоваться,
отправив баг репорт.
баг это или нет не знаю но ответить они могут.
DEADHUNT
3.10.2009, 19:08
Цитата(kwisp @ 3.10.2009, 19:58)

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