Russian Qt Forum
Сентябрь 30, 2024, 14:29 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: последовательное выполнение двух процессов с помощью QProcess  (Прочитано 4950 раз)
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-файл, это бы позволило не заморачиваться, почему тут что-то не так работает?
« Последнее редактирование: Июль 31, 2009, 15:02 от n. tr. » Записан
BRE
Гость
« Ответ #1 : Июль 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 (который пустой).
Записан
n. tr.
Гость
« Ответ #2 : Июль 31, 2009, 15:52 »

это я когда сюда помещал, не убрал лишнего.

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

В общем, мораль такова, надеюсь, кому-то окажется полезной: как всегда следует внимально относиться к тому, что делать локальной переменной, а что - членом класса - ведь будь тут какой-нибудь короткий процесс, а не долго работающий архиватор, ошибка бы не проявлялась, до поры - до времени, естественно, и была бы труднообнаружима...
Ну и, конечно, нужно смотреть внимательно в отладочный аутпут - там была запись QProcess: Destroyed while process is still running, а я, лопух, сначала не заметил, а потом даже когда заметил, не придал значения.
Записан
uriel
Гость
« Ответ #3 : Июль 31, 2009, 17:44 »

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

Не зная точных условий задачи, могу и ошибаться, но по-моему сигналы/слоты здесь явно лишние.
Код
C++ (Qt)
QProcess ungzip;
ungzip.start("gzip -d *.Z");
if (ungzip.waitForFinished())
   convert();
 

В waitForFinished стоит 30 секунд как параметр по умолчанию, поэтому если процессу нужно больше времени, то отработать до конца он не сможет.
Кроме того, это графическое приложение, поэтому заморозка интерфейса нежелательна.
Записан
alexman
Гость
« Ответ #5 : Август 03, 2009, 10:00 »

Зачем два процесса, Можно много потоков Подмигивающий Если не хочешь замарачиваться, то используй QtConcurrent.
Записан
n. tr.
Гость
« Ответ #6 : Август 03, 2009, 12:50 »

Зачем два процесса, Можно много потоков Подмигивающий
Не понимаю, как и зачем?
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.324 секунд. Запросов: 21.