Russian Qt Forum

Qt => Общие вопросы => Тема начата: n. tr. от Июль 31, 2009, 14:59



Название: последовательное выполнение двух процессов с помощью QProcess
Отправлено: n. tr. от Июль 31, 2009, 14:59
Есть ряд архивов, из каждого нужно извлечь файл и дальше его переконвертить одной программой.
Пока так:

Код
C++ (Qt)
void myClass::ExtractFromArchives()
{
 
QProcess ungzip;
connect(&ungzip, SIGNAL(finished(int, QProcess::ExitStatus)),
this, SLOT(Сonvert(int, QProcess::ExitStatus)));
ungzip.start("gzip -d *.Z");
 
}
 
void myClass::Convert(int, QProcess::ExitStatus)
{
 
QStringList Files;
 
QDir dir;
crxFiles = dir.entryList(QStringList("*.??d")); //файлы из архивов с расширением ??d
QString fname;
 
foreach (fname, Files)
{
QProcess::execute("convert", QStringList(fname)); //прога конвертит, создаёт новый файл
QFile::remove(fname); //неконкерченный файл удаляется
}
}

То, что находится в методе Convert сначала я вообще поместил в ExtractFromArchives - ну там понятно, не работало - конвертер начинал работать раньше, чем заканчивалось разархивирование, в итоге файлы разархивировались, но конвертер уже закончил "работу".
В приведённом коде тоже получается безобразие - почему-то сигнал finished испускается до окончания разархивирования, в итоге ни разархивированных файлов, ни их конвертации.
Объясните, что я делаю не так?

Если возможность из Qt запустить просто bat-файл, это бы позволило не заморачиваться, почему тут что-то не так работает?


Название: Re: последовательное выполнение двух процессов с помощью QProcess
Отправлено: BRE от Июль 31, 2009, 15:07
Код
C++ (Qt)
void myClass::Convert(int, QProcess::ExitStatus)
{
QStringList Files;
 
QDir dir;
crxFiles = dir.entryList(QStringList("*.??d")); //файлы из архивов с расширением ??d
QString fname;
 
foreach (fname, Files)
{
QProcess::execute("convert", QStringList(fname)); //прога конвертит, создаёт новый файл
QFile::remove(fname); //неконкерченный файл удаляется
}
}

Что бросилось в глаза.
Имена файлов помещаются в crxFiles, а цикл идет по Files (который пустой).


Название: Re: последовательное выполнение двух процессов с помощью QProcess
Отправлено: n. tr. от Июль 31, 2009, 15:52
это я когда сюда помещал, не убрал лишнего.

В общем, проблема решилась - процесс ungzip не должен быть локальной переменной метода, т.к. при выходе из метода он убивается, не смотря на то, что не отработал ещё.

В общем, мораль такова, надеюсь, кому-то окажется полезной: как всегда следует внимально относиться к тому, что делать локальной переменной, а что - членом класса - ведь будь тут какой-нибудь короткий процесс, а не долго работающий архиватор, ошибка бы не проявлялась, до поры - до времени, естественно, и была бы труднообнаружима...
Ну и, конечно, нужно смотреть внимательно в отладочный аутпут - там была запись QProcess: Destroyed while process is still running, а я, лопух, сначала не заметил, а потом даже когда заметил, не придал значения.


Название: Re: последовательное выполнение двух процессов с помощью QProcess
Отправлено: uriel от Июль 31, 2009, 17:44
Не зная точных условий задачи, могу и ошибаться, но по-моему сигналы/слоты здесь явно лишние.
Код
C++ (Qt)
QProcess ungzip;
ungzip.start("gzip -d *.Z");
if (ungzip.waitForFinished())
   convert();
 


Название: Re: последовательное выполнение двух процессов с помощью QProcess
Отправлено: n. tr. от Август 02, 2009, 20:40
Не зная точных условий задачи, могу и ошибаться, но по-моему сигналы/слоты здесь явно лишние.
Код
C++ (Qt)
QProcess ungzip;
ungzip.start("gzip -d *.Z");
if (ungzip.waitForFinished())
   convert();
 

В waitForFinished стоит 30 секунд как параметр по умолчанию, поэтому если процессу нужно больше времени, то отработать до конца он не сможет.
Кроме того, это графическое приложение, поэтому заморозка интерфейса нежелательна.


Название: Re: последовательное выполнение двух процессов с помощью QProcess
Отправлено: alexman от Август 03, 2009, 10:00
Зачем два процесса, Можно много потоков ;) Если не хочешь замарачиваться, то используй QtConcurrent.


Название: Re: последовательное выполнение двух процессов с помощью QProcess
Отправлено: n. tr. от Август 03, 2009, 12:50
Зачем два процесса, Можно много потоков ;)
Не понимаю, как и зачем?