crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

> связь между терминалом и gui программой
ht1515
  опции профиля:
сообщение 31.1.2014, 18:00
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 29
Регистрация: 14.4.2012
Пользователь №: 3324

Спасибо сказали: 0 раз(а)




Репутация:   0  


Всем привет!
Есть консольная программа - терминал. Там вводятся команды, выполняются и результат сразу же печатается в программе( н-р командная строка в винде ).
Я хочу ее связать с gui программой написанной на куте. Никакой сессии, общей памяти консольная программа не дает. Она подразумевает наличие оператора ПК, который тыкать будет команды.
Можно ли каким-нибудь хитрым способом передавать консольной проге команды, чтобы она их выполняла и потом получать ответ?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
ht1515
  опции профиля:
сообщение 31.1.2014, 20:46
Сообщение #2


Студент
*

Группа: Участник
Сообщений: 29
Регистрация: 14.4.2012
Пользователь №: 3324

Спасибо сказали: 0 раз(а)




Репутация:   0  



ммм... спасибо. Посмотрю.

Я прокомментирую ,вы поправьте если что.

Цитата
QStringList args;
args << "split";
args << "-w";
args << "-O" << "always";
args << "-n" << "%04d";
args << "-t" << mFilePrefix +"%n";
args << "-d" << mWorkDir;
args << disk()->audioFileName();
//qDebug() << args;


формирование входных параметров консольной программы. Необходимы при запуске программы.


Цитата
QString shntool = settings->value(Settings::Prog_Shntool).toString();

Видимо путь до программы.

Цитата
mProcess = new QProcess();
mProcess->setReadChannel(QProcess::StandardError);

создание объекта процесса и установка ??? канала на чтение ошибок?

Цитата
mProcess->start(shntool, args);
mProcess->waitForStarted();


Запуск процесса( консольной программы) и ожидание ее готовности к работе.

Цитата
sendCueData();

Отправка каких-то данных. Пока не углубляюсь куда и каких данных.
В этой функции mProcess->write(" INDEX 01 00:00:00\n"); --- Видимо что-то пишется в консоль программы(cin, stdin)

Цитата
mProcess->closeWriteChannel();

закрыли процесс записи в консольку. Это имитация нажатия кнопки enter?

Цитата
parseOut();

Производим чтение результата выполнения команды. По сути чтение с консоли и парсинг.

Цитата
mProcess->waitForFinished(-1);

блокировка потока пока процесс консольной программы не будет завершет.

Цитата
QProcess *proc = mProcess;
mProcess = 0;
delete proc;

garbage collector

Цитата
if (OutFormat::currentFormat()->createCue())
{
CueCreator cue(disk());
cue.setHasPregapFile(mPreGapExists);
if (!cue.write())
error(disk()->track(0), cue.errorString());
}

Какая-то работа с файлом.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Sokoloff
  опции профиля:
сообщение 1.2.2014, 0:11
Сообщение #3


Участник
**

Группа: Участник
Сообщений: 237
Регистрация: 1.4.2009
Из: Москва
Пользователь №: 654

Спасибо сказали: 50 раз(а)




Репутация:   11  


Все что я не комментирую правильно.

Цитата(ht1515 @ 31.1.2014, 21:46) *
Цитата
mProcess = new QProcess();
mProcess->setReadChannel(QProcess::StandardError);

создание объекта процесса и установка ??? канала на чтение ошибок?

У консольной программы есть 3 потока:
STDIN - входные данные, обычно он связан с клавиатурой, но может быть и чем то другим. Например "dir | sort" sort получает на вход выхлоп ls.
STDOUT - выходной, сюда печатаются обычные выходные данные.
STDERR - выходной, сюда выводятся сообщения об ошибках.
Деление между последними условное, так принято. И, если STDOUT все используют по назначению, то в STDERR выводят не только ошибки, а все что не должно путаться с STDOUT-ом. В моем случае на STDERR выводятся проценты выполнения работы. Именно они меня и интересуют, поэтому я говорю QProcess-у что его readXXX функции будут читать STDERR.

Цитата(ht1515 @ 31.1.2014, 21:46) *
Цитата
mProcess->closeWriteChannel();

закрыли процесс записи в консольку. Это имитация нажатия кнопки enter?

Нет это имитация окончания входного файла. Например если запустить программу "sort < file.txt", то sort будет читать данные из файла file.txt до тех пор пока он не кончится. А после уже отсортирует и выведет их, так вот closeWriteChannel это имитация окончания файла. Или в случае "dir | sort" окончание работы первой программы. Вот это тебе делать и не надо, не закрывай канал. А enter передается обычным переводом строки("\n").

Да, еще. Консольная программа может получать команды разными методами. Стандартный подход через STDIN, и тогда мой подход сработает. Но программа может сама обрабатывать нажатия клавиатуры, и тогда придется извращаться.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


3 чел. читают эту тему (гостей: 3, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 22.11.2024, 21:15