Сейчас на форуме: _MBK_, tyns777, UniSoft (+11 невидимых)

 eXeL@B —› Программирование —› Qt и работа с консолью
Посл.ответ Сообщение


Ранг: 756.3 (! !), 113thx
Активность: 0.610.05
Статус: Участник
Student

Создано: 01 июля 2012 23:40
· Личное сообщение · #1

Может кто на Qt пишет или писал... Созрел следующий вопрос:
Есть софт по работе с определённым железом, т.е. запускается прога, и входит в свой режим консольный, где реагирует на свои команды до команды стоп
Может криво выражаюсь, но думаю суть ясна...
Вопрос в следующем: для софта на Qt пишется простенький GUI
Как общаться с программкой в данном случае? Может в Qt для этого что-то предусмотренно более оправданное, чем тупое перенаправление вывода в файл и вылавливать регулярлярками нужные данные?

-----
z+Dw7uLu5+jqLCDq7vLu8PvpIPHs7uMh





Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 02 июля 2012 00:22
· Личное сообщение · #2

если программа общается только через консоль - то думаю никак, кроме как перенаправление файл из файла

может поступить по хЕкерски? и ловить хучить в программе функцию этого обработчика?
а QT программа что бы ею управляла



Ранг: 0.0 (гость)
Активность: 0.250
Статус: Участник

Создано: 02 июля 2012 01:48
· Личное сообщение · #3

Isaev
Если я правильно понял вопрос, то самое простое это юзать QProcess, позволяет запускать, писать и считывать консоль, ну или уточняй вопрос.
По ссылке страница справки по классу Ссылка




Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 02 июля 2012 01:53
· Личное сообщение · #4

дак там все равно писать и читать текстовые данные
я так понял он хочет не текстовые, что бы не напрягать всякие регекспы



Ранг: 0.0 (гость)
Активность: 0.250
Статус: Участник

Создано: 02 июля 2012 01:56 · Поправил: F_a_u_s_t
· Личное сообщение · #5

reversecode
Ну да, текстовые, просто в отличии от виндовских пайпов это будет работать везде где работает QT.
На сколько я знаю законных-без хаков нет вариантов хотя я не гуру QT может все таки и есть но я не знаю.
Есчо интересный класс - QIODevice.
Хотя сам не разу не пользовался этим классом, не было необходимости но тоже с консолью может работать.




Ранг: 756.3 (! !), 113thx
Активность: 0.610.05
Статус: Участник
Student

Создано: 02 июля 2012 06:56
· Личное сообщение · #6

reversecode если хучить будет ли оно потом кроссплатформенно? В винде же хуки на WinAPI, а в никсах я вообще слабо представляю как организовать...

F_a_u_s_t спс, вроде то, теперь хоть есть в какую сторону думать, если зайду в тупик, вернусь

-----
z+Dw7uLu5+jqLCDq7vLu8PvpIPHs7uMh




Ранг: 4.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 02 июля 2012 09:32 · Поправил: MNV
· Личное сообщение · #7

QLocalServer + QLocalSocket + QSharedMemory если консольное приложение свое. QProcess если чужое.




Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 02 июля 2012 11:45
· Личное сообщение · #8

я думаю если все так серьезно то можно связатся с производителем
и получить всю документацию или полностью соурсы утилиты
и написать нормальное гуи приложение котрое общается сразу с железкой
оно там через ком порт общается?
или же разверсить утилиту, думаю она не больше 200 кил



Ранг: 0.0 (гость)
Активность: 0.250
Статус: Участник

Создано: 02 июля 2012 12:40 · Поправил: F_a_u_s_t
· Личное сообщение · #9

reversecode
Инициатива наказуема в виде последующего геморроя, в рашке так, да и reversecode пишет:
разверсить утилиту
тоже не так просто в плане лицензии, если контора не ООО "Рога и копыта" то никто не даст пока правообладатель не даст добро, у меня уже был такой опыт, контара которая писала программу закрылась, так искали правообладателя и брали у него разрешение (нужно было перенести программу с кларионовской базы на SQLite), ну и самое главное что надо убедить руководство что без этого мир сломается и самое главное что нужна дополнительная оплата по мимо зарплаты, вот это самое сложное.

Add:
Тоже верно, кто ничего не делает тот ничего и не получает.




Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 02 июля 2012 13:03
· Личное сообщение · #10

"стучитесь и вам откроют" (c)




Ранг: 756.3 (! !), 113thx
Активность: 0.610.05
Статус: Участник
Student

Создано: 02 июля 2012 15:15
· Личное сообщение · #11

MNV
чужое, но спс
reversecode пишет:
я думаю если все так серьезно то можно связатся с производителеми получить всю документацию или полностью соурсы утилитыи написать нормальное гуи приложение котрое общается сразу с железкой

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

и хватит уже дискутировать, меня уже послали в нужном направлении... разбераюсь ))

не совсем доосмыслил один момент:
процесс запускается, ищет вокруг устройства в бесконечном цикле, выводит в консоль найденные мак-адреса. Через QProcess надо же сначала дождаться "завершения бесконечного цикла " или можно читать в процессе? Если можно, на что реагировать?

-----
z+Dw7uLu5+jqLCDq7vLu8PvpIPHs7uMh




Ранг: 0.0 (гость)
Активность: 0.250
Статус: Участник

Создано: 02 июля 2012 16:34 · Поправил: F_a_u_s_t
· Личное сообщение · #12

Isaev пишет:
на что реагировать?

waitForXXX где XXX == Finished ReadyRead итд.
Add:
Мимоходом нашел годный пример --> Link <--




Ранг: 756.3 (! !), 113thx
Активность: 0.610.05
Статус: Участник
Student

Создано: 03 июля 2012 02:57
· Личное сообщение · #13

F_a_u_s_t как я и думал, всё уже придумано до нас )
спс, не придётся изобретать велосипед

-----
z+Dw7uLu5+jqLCDq7vLu8PvpIPHs7uMh





Ранг: 756.3 (! !), 113thx
Активность: 0.610.05
Статус: Участник
Student

Создано: 16 июля 2012 21:24 · Поправил: Isaev
· Личное сообщение · #14

Code:
  1.     QProcess term;
  2.     term.setProcessChannelMode(QProcess::MergedChannels);
  3.  
  4.     term.start("gnome-terminal");
  5.     if (!term.waitForStarted())  {
  6.       ui->listWidget_bs->addItem("Terminal Start Fehler");
  7.       exit;
  8.     }
  9.  
  10.     term.waitForReadyRead(); // до сюда всё ок
  11.     QByteArray res;
  12.     
  13.     term.write("echo hello"); // а вот это в консоль уже не пишется!
  14.     term.write("\n");
  15.  
  16.     term.waitForReadyRead();
  17.     res = term.readLine(); // И, соответственно, тут ничего не читается!


В чём косяк?

-----
z+Dw7uLu5+jqLCDq7vLu8PvpIPHs7uMh




Ранг: 0.0 (гость)
Активность: 0.250
Статус: Участник

Создано: 17 июля 2012 01:00
· Личное сообщение · #15

Isaev
Code:
  1.     QTextStream stream(stdout);
  2.     QProcess cmd;
  3.     cmd.setProcessChannelMode(QProcess::MergedChannels);
  4.  
  5.     cmd.start("cmd");
  6.     if (cmd.waitForStarted() == NULL)
  7.     {
  8.         return false;
  9.     }
  10.  
  11.     cmd.waitForReadyRead();
  12.     QByteArray result = cmd.readAll();
  13.  
  14.     cmd.write("help");
  15.     cmd.write("\n");
  16.  
  17.     cmd.waitForReadyRead();
  18.  
  19.     result = cmd.readLine();
  20.     result = cmd.readAll();
  21.  
  22.     stream << result.data();


У меня нормально работает.




Ранг: 756.3 (! !), 113thx
Активность: 0.610.05
Статус: Участник
Student

Создано: 17 июля 2012 01:12
· Личное сообщение · #16

ну я во-первых не под виндой,
во-вторых не из консольного приложения это делаю(может косяк в этом)

-----
z+Dw7uLu5+jqLCDq7vLu8PvpIPHs7uMh




Ранг: 0.0 (гость)
Активность: 0.250
Статус: Участник

Создано: 17 июля 2012 01:28
· Личное сообщение · #17

Isaev
Из за гуя не может быть проблем, а иксов у меня под рукой нет.
Что у тебя в консоль выводится, должны быть стандартные сообщения Qt.
Попробуй закомментировать эту строку - term.setProcessChannelMode(QProcess::MergedChannels);
Без нее работает?




Ранг: 756.3 (! !), 113thx
Активность: 0.610.05
Статус: Участник
Student

Создано: 17 июля 2012 08:35 · Поправил: Isaev
· Личное сообщение · #18

F_a_u_s_t не выводится ничего, просто пустая консоль запускается
комментировал, ничего не меняется... я её потом в хелпе нарыл изначально и не было

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

-----
z+Dw7uLu5+jqLCDq7vLu8PvpIPHs7uMh





Ранг: 756.3 (! !), 113thx
Активность: 0.610.05
Статус: Участник
Student

Создано: 19 июля 2012 17:05
· Личное сообщение · #19

F_a_u_s_t а у тебя какая версия Qt? может QProcess с какой-то версии определённой начался только?

-----
z+Dw7uLu5+jqLCDq7vLu8PvpIPHs7uMh




Ранг: 0.0 (гость)
Активность: 0.250
Статус: Участник

Создано: 19 июля 2012 18:57
· Личное сообщение · #20

Isaev
У меня 4.8, а когда появился QProcess, куй его знает.


 eXeL@B —› Программирование —› Qt и работа с консолью
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати