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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: QProcess и tar  (Прочитано 10153 раз)
ZIkos
Гость
« : Декабрь 05, 2007, 11:28 »

В своей программе я архивирую данные tar архиватором, мне необходимо чтобы лог архивирования отображался в QTextEdit.
Код:
             m_pProcessTar = new QProcess();
   //Отслеживаем удачно ли запустился процесс архивации
   connect(m_pProcessTar, SIGNAL(error(QProcess::ProcessError)),
         this, SLOT(OnTarError(QProcess::ProcessError)));

   //Отображаем процесс архивации. Не работает!!!!!!!!!!!!!!!!!!!!!
   connect(m_pProcessTar, SIGNAL(readyReadStandardOutput()),
         this, SLOT(OnTarOutput()));
   connect(m_pProcessTar, SIGNAL(readyReadStandardError()),
      this, SLOT(OnTarOutput()));

   m_pProcessTar->setProcessChannelMode(QProcess::ForwardedChannels);

   QString strArguments = tr("tar cfv с:\123.tar  c:\windows)
   m_pProcessTar->start(strArguments);
   m_pProcessTar->waitForFinished();
}

void CCreateDistribTree::OnTarError(QProcess::ProcessError error)
{
   if(error == QProcess::FailedToStart)
   {
      m_pCopyDialog->TarError();
   }
}

void CCreateDistribTree::OnTarOutput()
{
   QByteArray  strNewText = m_pProcessTar->readAllStandardOutput();
   m_pTextEdit->append(QString::fromLocal8Bit(strNewText));

   strNewText = m_pProcessTar->readAllStandardError();
   m_pTextEdit->append(QString::fromLocal8Bit(strNewText));
}

Выполняя архивацию в командной строке лог архивирования отображается, а когда выполняется мой код, то архивация проходит нормально, но никакого лога НЕТ, и даже программа не попадает в слот OnTarOutput.

Подскажите как с этим справиться?
« Последнее редактирование: Декабрь 05, 2007, 11:45 от ZIkos » Записан
Alex03
Гость
« Ответ #1 : Декабрь 05, 2007, 11:50 »

А убрать m_pProcessTar->waitForFinished(); ?
Записан
ZIkos
Гость
« Ответ #2 : Декабрь 05, 2007, 11:57 »

А убрать m_pProcessTar->waitForFinished(); ?


Не помогло.
Записан
Mikhail
Программист
*****
Offline Offline

Сообщений: 587


Просмотр профиля
« Ответ #3 : Декабрь 05, 2007, 13:03 »

В своей программе я архивирую данные tar архиватором, мне необходимо чтобы лог архивирования отображался в QTextEdit.
Код:
             m_pProcessTar = new QProcess();
   //Отслеживаем удачно ли запустился процесс архивации
   connect(m_pProcessTar, SIGNAL(error(QProcess::ProcessError)),
         this, SLOT(OnTarError(QProcess::ProcessError)));

   //Отображаем процесс архивации. Не работает!!!!!!!!!!!!!!!!!!!!!
   connect(m_pProcessTar, SIGNAL(readyReadStandardOutput()),
         this, SLOT(OnTarOutput()));
   connect(m_pProcessTar, SIGNAL(readyReadStandardError()),
      this, SLOT(OnTarOutput()));

   m_pProcessTar->setProcessChannelMode(QProcess::ForwardedChannels);

   QString strArguments = tr("tar cfv с:\123.tar  c:\windows)
   m_pProcessTar->start(strArguments);
   m_pProcessTar->waitForFinished();
}

void CCreateDistribTree::OnTarError(QProcess::ProcessError error)
{
   if(error == QProcess::FailedToStart)
   {
      m_pCopyDialog->TarError();
   }
}

void CCreateDistribTree::OnTarOutput()
{
   QByteArray  strNewText = m_pProcessTar->readAllStandardOutput();
   m_pTextEdit->append(QString::fromLocal8Bit(strNewText));

   strNewText = m_pProcessTar->readAllStandardError();
   m_pTextEdit->append(QString::fromLocal8Bit(strNewText));
}

Выполняя архивацию в командной строке лог архивирования отображается, а когда выполняется мой код, то архивация проходит нормально, но никакого лога НЕТ, и даже программа не попадает в слот OnTarOutput.

Подскажите как с этим справиться?


Попробуй убрать :
m_pProcessTar->setProcessChannelMode(QProcess::ForwardedChannels);
Записан
ZIkos
Гость
« Ответ #4 : Декабрь 05, 2007, 13:10 »

Mikhail, убрал m_pProcessTar->setProcessChannelMode(QProcess::ForwardedChannels); тоже не помогло.

У кого нибудь есть еще идеи?
Записан
Вячеслав
Гость
« Ответ #5 : Декабрь 05, 2007, 14:47 »

IMHO tar cvf
f требует имя файла ,а ты ему че скармливаешь ? Подмигивающий
И man tar рулит Подмигивающий
PS я-б еще -j или -z добавил ж)
Записан
ZIkos
Гость
« Ответ #6 : Декабрь 05, 2007, 15:03 »

IMHO tar cvf
f требует имя файла ,а ты ему че скармливаешь ? Подмигивающий
И man tar рулит Подмигивающий
PS я-б еще -j или -z добавил ж)


f параметр для указания имени архива(без параметра f архив кладется на дискету).
j параметр для добавления комментариев, они мне не нужны
z параметр для сжатия, Мне хотябы пока без сжатия сделать, чтобы лог арихивирования прочитать

А что такое  man tar?
Записан
Alex03
Гость
« Ответ #7 : Декабрь 05, 2007, 15:34 »

Mikhail, убрал m_pProcessTar->setProcessChannelMode(QProcess::ForwardedChannels); тоже не помогло.

У кого нибудь есть еще идеи?
Идеи....
1. Запускать не tar (мало ли, мож там анализ какойнить откуда запущен и нужен ли вывод), а чтото с гарантированным выводом типа
Код:
cmd /c echo string
или
Код:
cmd /c type file.txt
2. Упростить код, (написать тестовый примерчик)
3. огласить весь код. (в приведённом примере нет начала, есть ошибки...)

Записан
Mikhail
Программист
*****
Offline Offline

Сообщений: 587


Просмотр профиля
« Ответ #8 : Декабрь 05, 2007, 15:50 »

По всему видно, что проблема проста как мир.

Как у тебя объявлено :
OnTarOutput()?
Скорее всего эта функция не объявлена слотом, поэтому нисего и не принимает.
Проверь!!!
 ЕСли объявлена как слот, то выложи для обозрения include для проверки.
Записан
ZIkos
Гость
« Ответ #9 : Декабрь 05, 2007, 15:53 »

Mikhail, убрал m_pProcessTar->setProcessChannelMode(QProcess::ForwardedChannels); тоже не помогло.

У кого нибудь есть еще идеи?
Идеи....
1. Запускать не tar (мало ли, мож там анализ какойнить откуда запущен и нужен ли вывод), а чтото с гарантированным выводом типа
Код:
cmd /c echo string
или
Код:
cmd /c type file.txt
2. Упростить код, (написать тестовый примерчик)
3. огласить весь код. (в приведённом примере нет начала, есть ошибки...)




запустил процесс с аргументами cmd /c echo string12312312312312
Все работает.
А вот с таром не хочет дружить.
Записан
ZIkos
Гость
« Ответ #10 : Декабрь 05, 2007, 16:07 »

наконец то удалось получить лог!!!!!
процесс надо запускать таким образом.

m_tarProcess.start("cmd /c tar cfv c:\123.tar c:\windows");

Теперь остается вопрос. Это сработает по виндой, а как быть под линукс?
Записан
Вячеслав
Гость
« Ответ #11 : Декабрь 05, 2007, 21:36 »

А тар-то у тебя какой кстати ?
Под пингвином в сторону [ba]sh смотреть ....
и ктати -j это работать через bzip2
А вообще http://www.opennet.ru/man.shtml?topic=tar&category=1&russian=2
И все-таки -f _требует аргумента_ правильнее ее пихать в данном случае последней иначе - возможны варианты ....
« Последнее редактирование: Декабрь 05, 2007, 21:46 от Вячеслав » Записан
Alex03
Гость
« Ответ #12 : Декабрь 06, 2007, 07:18 »

m_tarProcess.start("cmd /c tar cfv c:\123.tar c:\windows");

да и в исходной
QString strArguments = tr("tar cfv с:\123.tar  c:\windows)

Надеюсь в коде обратные слеши заэкранированны?

Записан
ZIkos
Гость
« Ответ #13 : Декабрь 06, 2007, 19:50 »

m_tarProcess.start("cmd /c tar cfv c:\123.tar c:\windows");

да и в исходной
QString strArguments = tr("tar cfv с:\123.tar  c:\windows)

Надеюсь в коде обратные слеши заэкранированны?



заэкранированы. этот код приводил для примера, так что не уследил
Записан
ZIkos
Гость
« Ответ #14 : Декабрь 07, 2007, 11:44 »

Кинитье пожалуйста сссылочку где можно скачать tar архиватор, который жмет в  bz2.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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