Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt Общие вопросы _ Вопрос по вызову 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


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

Автор: kwisp 16.3.2009, 12:35

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

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

на форуме есть темы по QProcess.

Автор: 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

Цитата(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 16.3.2009, 13:21

Цитата(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(); не работает... почему ?

Автор: BRE 16.3.2009, 16:55

Цитата(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, не цитируйте целыми сообщениями, как цитировать по чуть-чуть написано http://www.forum.crossplatform.ru/index.php?showtopic=1455

Автор: 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

Автор: kwisp 3.10.2009, 17:32

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

извиняюсь не прав .
сейчас попробовал, остается командная строка.
хм...

Автор: DEADHUNT 3.10.2009, 17:34

работа не была завершенна, в скрипте же есть pause в конце.

Автор: kwisp 3.10.2009, 17:38

почему не хочешь так?

arg = QStringList() << "calc.exe";
projectProcess->start("console_runner.bat", arg);

Автор: DEADHUNT 3.10.2009, 17:45

также работает(calc запускается), но консоль не показывается. например вместо calc надо ping запустить, но консоли нет и результатов не видно.

Автор: kwisp 3.10.2009, 17:47

DEADHUNT,
мож настройки винды такие.
а примерчика компилируемого нет?

Автор: DEADHUNT 3.10.2009, 18:10

примерчик очень большой(не один десяток файлов), судя по гуглу Qt так работает, сам можешь скомпилировать минимальный код который я написал выше и всё увидишь.
QProcess::start не показывает консоль
QProcess::startDetached показывает (static class member).
но надо также отлавливать завершение процесса или вручную завершить процесс, поэтому второй вариант не подходит.

смысл всего этого кода сделать что то типа загрузчика програм(в идеале как в VS Start Without Debug).

Автор: kwisp 3.10.2009, 18:14

DEADHUNT,
да start запускает консоль(в процессах видно), но скрывает её,
а видно консоль только если её отделить сразу же от процесса, а если отделлить то сигнала о завершении не получить.
:(

Автор: DEADHUNT 3.10.2009, 18:19

выход только WinAPI и условную компиляцию использовать? в линуксе отлично xterm работает.

Автор: Litkevich Yuriy 3.10.2009, 18:43

DEADHUNT, командная строка может захлопнутся, если программа вызываемая в батнике вернёт не нуль.

П.С. сам на такое наталкивался при выборочной компиляции Qt и вот к такому выводу пришёл.

Автор: kwisp 3.10.2009, 18:49

DEADHUNT,
я запустил так

QStringList s;
proc.start("bat.bat",s);

файл bat.bat
start cmd

сигнал о завершении работы приходит.

Автор: DEADHUNT 3.10.2009, 18:54

спасибо, но всётаки интересно как же тогда VS делает терминал через AllocConsole, или тоже какойто скрипт запускает?
а может проблему с завершением программы решить так progname || 1, только тогда вывод не красивый получается.

Автор: kwisp 3.10.2009, 18:58

это тебе надо к знатокам винды:)
сомневаюсь, это наверное особенность Qt.
можно у разарботчиков поинтересоваться,
отправив баг репорт.
баг это или нет не знаю но ответить они могут.

Автор: DEADHUNT 3.10.2009, 19:08

Цитата(kwisp @ 3.10.2009, 19:58) *
баг это или нет не знаю но ответить они могут.

да нет не баг, в интернете есть подобные темы, включая на trolltech например
http://lists.trolltech.com/qt-interest/2005-08/thread01065-0.html

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)