Russian Qt Forum

Qt => Многопоточное программирование, процессы => Тема начата: Disa от Июнь 03, 2013, 14:30



Название: QProcess и QThreads
Отправлено: Disa от Июнь 03, 2013, 14:30
Добрый день.

Требуется запустить 3и сторонних паралелльно работающих процесса и закрывать их по надобнсти. Процессы работают бесконечно, пока не получат Ctrl+C (если запущены из терминала) или соответсвенно "kill".

Почему-то просто в слоте:
Код
C++ (Qt)
screenCaprtureParameters << ...;
captureScreenProcess.start("/.../avconv", screenCaprtureParameters);

выдает captureScreenProcess.state() = 1, captureScreenProcess.errorString() "Unknown error" и ничего не происходит.

Если делать через execute или startDeatached, все работает. Но execute вешает GUI (т.к. процесс бесконечный), а если startDeateched, нужно управлять через полученный PID.

Добавил новый поток и сделал в слоте вот так:

Код
C++ (Qt)
captureScreenThread = new QThread(this);
captureScreenProcess.moveToThread(captureScreenThread);
screenCaprtureParameters << ...;
captureScreenProcess.start(".../avconv", screenCaprtureParameters);
captureScreenThread->start();

и по прежнему происходит ровно тоже самое что и раньше.

PS: Вопрос - если делать отдельный класс унаследованный от QThread, который должен запускать этот процесс и крутить его, то при перегрузке run нужно в теле метода тоже писать start()?


Название: Re: QProcess и QThreads
Отправлено: mutineer от Июнь 03, 2013, 14:33
Нет, в теле run() писать start() не надо, его надо вызывать как и раньше у объекта потока


Название: Re: QProcess и QThreads
Отправлено: Disa от Июнь 04, 2013, 16:26
Да у меня руки не из того места. С потоками разобрался и где-то прочел, что start будет работать в том же потоке где и объявлялся указатель на qprocess. Меня больше смутило, что у меня start ничего не делал, потом выяснилось, что чисто для консольных утилит нужно либо ловить сигналы типа readyReadStandardOutput, либо же запускать через терминал / cmd. Я пока сделал второе, вроде работает. Костыль, конечно.

PS: Мб кто-нибудь кто-то знает, как запустить параллельно 2е и более консольные утилиты не вызывая терминала?