Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с консолью в Qt 
:(
    Опции темы
Isaev
Дата 19.7.2012, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 8.11.2007
Где: Germany

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



Доброго всем дня!

Проблема в следующем: Имеется консольное приложение, которое запускается в виде терминала и принимает свой ограниченный набор команд
Нужно сделать GUI надстройку, т.е. по нажатию кнопки запустить, считать данные ответа из консоли и вывести на форму

Если я правильно понял, то класса qProcess  должно хватить для выполнения данной задачи

и так ближе к коду... вот что вышло:
Код

 QProcess term;
    term.setProcessChannelMode(QProcess::MergedChannels);
 
    term.start("gnome-terminal");
    if (!term.waitForStarted())  {
      ui->listWidget_bs->addItem("Terminal Start Fehler");
      exit;
    }
    // до этого момента всё ок
    term.waitForReadyRead(); 
    QByteArray res;
    
    term.write("echo hello"); // а вот это в консоль уже не пишется!
    term.write("\n");
 
    term.waitForReadyRead();
    res = term.readLine(); // И, соответственно, тут ничего не читается!


программа запускает консоль, но не выводится ничего, просто пустая консоль запускается
приложение где-то подвисает, возможно на term.waitForReadyRead();
при этом консоль пустая, но реагирует на команды с клавиатуры
через пол минуты убивается автоматом с сообщением
QProcess: Destroyed while process is still running. (в окошке ошибок снизу)
только потом доходит до команды вывода результата, и он пустой, даже если что-то вводишь сам

Собираю под Ubuntu тот же пример собирали под Windows и там всё работает
Как бороться с данной проблемой?

Это сообщение отредактировал(а) Isaev - 19.7.2012, 15:50
PM MAIL ICQ   Вверх
borisbn
Дата 19.7.2012, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Isaev @  19.7.2012,  15:49 Найти цитируемый пост)
term.waitForReadyRead();

Цитата(Isaev @  19.7.2012,  15:49 Найти цитируемый пост)
term.write("echo hello");

ничего в глаза не бросается ?
убери этот waitForReady. он там не нужен.
если интересует, я могу скинуть обёртку над консольным приложением. как-то делал...


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


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 8.11.2007
Где: Germany

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



Цитата(borisbn @  19.7.2012,  15:55 Найти цитируемый пост)
ничего в глаза не бросается ?убери этот waitForReady. он там не нужен.

пошел грузить убунту и пробовать

Цитата(borisbn @  19.7.2012,  15:55 Найти цитируемый пост)
если интересует, я могу скинуть обёртку над консольным приложением. как-то делал...

интересует очень... Отпало бы сразу множество вопросов. Буду очень признателен.

думал вообще придётся велосипед изобретать, а тут вроде более-менее работа с терминалом есть.
PM MAIL ICQ   Вверх
borisbn
Дата 19.7.2012, 17:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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





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


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 8.11.2007
Где: Germany

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



borisbn пример правильного использования можно?

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

получается я могу послать команду стоп, потом считать ответ из консоли
а можно как-то реагировать на то, что в консоль добавилась новая строка и сразу её получать?
т.е. чтобы в GUI процесс поиска был виден, а не жать постоянно стоп/старт не зная найдено там уже что-то или нет

ну и глупый вопрос до кучи:
как сделать чтобы консоль запускалась а root mode?


Это сообщение отредактировал(а) Isaev - 31.7.2012, 20:08
PM MAIL ICQ   Вверх
borisbn
Дата 3.8.2012, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Isaev @  31.7.2012,  16:46 Найти цитируемый пост)
 пример правильного использования можно?

Код

// твой h-файл
#include "WindowsWrapper.h"

class YourClass : public QWidget
{
Q_OBJECT
public:
    YourClass();
private:
    WindowsWrapper m_consoleWrapper;
private slots:
    void onReadyRead( QString line );
};

// твой cpp-файл
YourClass::YourClass()
    : m_consoleWrapper( "/path/to/console/prog/", "prog_name" )
{
    connect( &m_consoleWrapper, SIGNAL( lineReaded( QString ) ), SLOT( onReadyRead( QString ) ) );
    m_consoleWrapper.start();
}

void YourClass::onReadyRead( QString line )
{
    // делаешь со строкой чо хошь :)
}



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

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

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


 




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


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

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