Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перехват вывода приложения, Вывод в GUI и файл 
V
    Опции темы
loneybibi
  Дата 13.11.2012, 09:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель
**


Профиль
Группа: Участник
Сообщений: 257
Регистрация: 28.5.2010
Где: Донецк (Украина)

Репутация: 3
Всего: 3



Есть консольное приложение и другое с GUI. Допустим у приложения с GUI  есть QTextEditor и запускаю я консольное приложение через QProcess::start(). Как сделать так что бы вывод консольного приложения попал QTextEditor ? smile

Вопрос второй. Как перехватить в виде текста для записи в лог файл все что выводит qDebug().

Заранее спасибо! smile 


--------------------
Red Hat Fedora 17
Qt 4.8.1 (x64), GCC 4.4.3,
G++ 4.4.3, QtCreator 2.4.1
PM MAIL ICQ   Вверх
borisbn
Дата 13.11.2012, 16:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



Вот тема - http://forum.vingrad.ru/index.php?showtopi...t&p=2505761 практически один в один. Я там выложил классик-обёртку над консольным приложением и пример использования.

Добавлено через 52 секунды
а вот - http://forum.vingrad.ru/index.php?showtopi...t&p=2464402 ответ на второй вопрос


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
loneybibi
Дата 13.11.2012, 20:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель
**


Профиль
Группа: Участник
Сообщений: 257
Регистрация: 28.5.2010
Где: Донецк (Украина)

Репутация: 3
Всего: 3



Спасибо, буду пока разбираться! 


--------------------
Red Hat Fedora 17
Qt 4.8.1 (x64), GCC 4.4.3,
G++ 4.4.3, QtCreator 2.4.1
PM MAIL ICQ   Вверх
loneybibi
Дата 13.11.2012, 21:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель
**


Профиль
Группа: Участник
Сообщений: 257
Регистрация: 28.5.2010
Где: Донецк (Украина)

Репутация: 3
Всего: 3



borisbn, не будет ли вызывать зависание GUI такой способ вывода если запущенный процесс будет выполнять длительную операцию? Или лучше вынести перехват консоли в отдельный поток?


--------------------
Red Hat Fedora 17
Qt 4.8.1 (x64), GCC 4.4.3,
G++ 4.4.3, QtCreator 2.4.1
PM MAIL ICQ   Вверх
loneybibi
Дата 13.11.2012, 22:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель
**


Профиль
Группа: Участник
Сообщений: 257
Регистрация: 28.5.2010
Где: Донецк (Украина)

Репутация: 3
Всего: 3



Первую проблему решил.
Кому нужно и интересно взял предложенный вариант borisbn чуток переделал и поместил в отдельный поток на всякий случай что бы не вызывать зависание GUI (хотя не проверял может быть такое или нет, лениво было smile ). 

Осталась маленькая проблема, удалить из полученной строки вывода последний символ переноса на новую строку "\n". Кстати кто подскажет как это сделать? smile

Вообщем получилась вот такая штука(ниже прикрепил готовый проект):
Код

#include "consolethread.h"

consoleThread::consoleThread(const QString& processPath, QObject *parent) :
    QThread(parent), processPath(processPath)
{
    /* Create new process,move to thread and connect slots */
    process=new QProcess;
    process->moveToThread(this);
    connect(process,SIGNAL(readyReadStandardOutput()),this,SLOT(slotReadyReadStd()));
    connect(process,SIGNAL(readyReadStandardError()),this,SLOT(slotReadyReadErr()));
}

/* Slot read standart output */
void consoleThread::slotReadyReadStd()
{
    process->setReadChannel(QProcess::StandardOutput);
    readyRead();
}

/* Slot read error output */
void consoleThread::slotReadyReadErr()
{
    process->setReadChannel(QProcess::StandardError);
    readyRead();
}

/* Read out from process */
void consoleThread::readyRead()
{
    while(process->canReadLine()){
        emit lineReaded(process->readLine());
        }
}

/* Slot end thread */
void consoleThread::slotEndThread()
{
    exit(0);
    process->close();
}

/* Run thread */
void consoleThread::run()
{
    process->start(processPath,QIODevice::ReadWrite);
    exec();
}


Присоединённый файл ( Кол-во скачиваний: 11 )
Присоединённый файл  untitled.zip 3,03 Kb


--------------------
Red Hat Fedora 17
Qt 4.8.1 (x64), GCC 4.4.3,
G++ 4.4.3, QtCreator 2.4.1
PM MAIL ICQ   Вверх
loneybibi
Дата 14.11.2012, 02:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель
**


Профиль
Группа: Участник
Сообщений: 257
Регистрация: 28.5.2010
Где: Донецк (Украина)

Репутация: 3
Всего: 3



Разобрался и со второй проблемой но как и с первой остались пару мелких вопросов.
Сделал по примеру Qt и добавил свою реализацию записи вывода Debug в файл.
Отсюда вопрос, правильно ли я сделал вывод в файл? При каждом поступлении новой записи
я каждый раз открываю файл, пишу и закрываю. Правильно ли это, не накладно для программы, 
и вообще правильно ли я реализовал сам вывод в файл? Или лучше как то один раз открыть
файл и писать в него?

Вот реализация:
Код

void writeMsgIntoLogFile(const char *msg)
{
    QFile file("out.log");
    file.open(QIODevice::Append);
    QTextStream stream(&file);
    stream.setAutoDetectUnicode(true);
    stream<<msg<<"\n";
    file.close();
}

void myMessageOutput(QtMsgType type, const char *msg)
{

    char *cchar=new char;
    QByteArray array=QDateTime::currentDateTime().toString().toLocal8Bit();
    array.append(" >>> ");
    array.append(msg);
    cchar=array.data();

    writeMsgIntoLogFile(cchar);

    switch (type) {
    case QtDebugMsg:
        fprintf(stderr,"%s\n", cchar);
        break;
    case QtWarningMsg:
        writeMsgIntoLogFile(msg);
        fprintf(stderr,"%s\n", msg);
        break;
    case QtCriticalMsg:
        writeMsgIntoLogFile(msg);
        fprintf(stderr,"%s\n", msg);
        break;
    case QtFatalMsg:
        writeMsgIntoLogFile(msg);
        fprintf(stderr,"%s\n", msg);
        abort();
    }
}

int main(int argc, char **argv)
{
    qInstallMsgHandler(myMessageOutput);
    QApplication app(argc, argv);

    MainWindow w;
    w.show();

    return app.exec();
}


Это сообщение отредактировал(а) loneybibi - 14.11.2012, 02:34


--------------------
Red Hat Fedora 17
Qt 4.8.1 (x64), GCC 4.4.3,
G++ 4.4.3, QtCreator 2.4.1
PM MAIL ICQ   Вверх
borisbn
Дата 14.11.2012, 08:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



Цитата(loneybibi @  13.11.2012,  21:44 Найти цитируемый пост)
не будет ли вызывать зависание GUI такой способ вывода если запущенный процесс будет выполнять длительную операцию? 

нет. не будет, т.к.
Цитата(http://qt-project.org/doc/qt-4.8/qprocess.html#start)
Note: Processes are started asynchronously, which means the started() and error() signals may be delayed. Call waitForStarted() to make sure the process has started (or has failed to start) and those signals have been emitted.

так что без потока можно спокойно обойтись

Цитата(loneybibi @  14.11.2012,  02:27 Найти цитируемый пост)
Отсюда вопрос, правильно ли я сделал вывод в файл? При каждом поступлении новой записи
я каждый раз открываю файл, пишу и закрываю. Правильно ли это, не накладно для программы, 
и вообще правильно ли я реализовал сам вывод в файл? Или лучше как то один раз открыть
файл и писать в него?

именно в этой реализации, когда в файл не пишется QtDebugMsg, а пишутся только критические вещи, думаю, что нет разницы (ведь, не будет же в программе каждую миллисекунду происходить QtCriticalMsg или QtFatalMsg... а если будут, то ИМХО нужно что-то предпринимать...)
А вот если записывать и QtDebugMsg, то да... такой подход очень накладный. Лучше 
Цитата(loneybibi @  14.11.2012,  02:27 Найти цитируемый пост)
один раз открыть файл и писать в него

но не забывать вызывать QFile::flush()

Это сообщение отредактировал(а) borisbn - 14.11.2012, 08:44


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
loneybibi
Дата 14.11.2012, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель
**


Профиль
Группа: Участник
Сообщений: 257
Регистрация: 28.5.2010
Где: Донецк (Украина)

Репутация: 3
Всего: 3



Спасибо большое! smile Тема закрыта! 


--------------------
Red Hat Fedora 17
Qt 4.8.1 (x64), GCC 4.4.3,
G++ 4.4.3, QtCreator 2.4.1
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0829 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.