Название: Взаимодействие между интерфейсом и консольной программой Отправлено: GrimmXXX от Октябрь 23, 2014, 16:56 Здравствуйте форумчане.
Я новичок в программировании(эх, как будто это кого-то оправдывало :)), поэтому вопросы будут скорее глупыми чем серьезными и занятными. Так получилось что начал я свое знакомство с программирования на Common Lisp. Пользуюсь SBCL+Slime. Пишу небольшие программы для сложных математических расчетов. Но дело не в этом. Программы все консольные, а написать интерфейс на sbcl оказалось для меня нетривиальной задачей. Коллеги на работе посоветовали написать интерфейс на C++ и прикрутить его к моей программе. Опыта программирования на C++ у меня нет. В простых примерах я разобрался, а вот дальше... Вроде задача-то простая: Создать окно, создать на нем несколько кнопок, повесить на каждую кнопку свой текст (код на sbcl) который при нажатии просто отправляется в консоль. Таким образом при запуске программы должен запускаться процесс c SBCL в консоли, а при нажатии одной из кнопок, текст(код на sbcl) отправляется в консоль и выполняется, причем ответ будет в графическом виде в gnuplot и по идее ответ из консоли принимать не обязательно, хотя было бы неплохо чтобы можно было читать ответ и отсылать его в интерфейс. Все что я смог сделать это запускать SBCL с кнопки. Гугление не особо помогло. Можете накидать пример кода, чтобы при нажатии определенная команда отправлялась в консоль. По небольшому примерчику я думаю разберусь. Заранее спасибо. Название: Re: Взаимодействие между интерфейсом и консольной программой Отправлено: Old от Октябрь 23, 2014, 17:13 Здесь небольшой пример, запускающий правда шёл, в котором видно как передавать данные процессу и читать данные от него.
http://www.prog.org.ru/index.php?topic=24084.msg170886#msg170886 Это синхронный обмен, так же можно сделать асинхронный через сигналы слоты. Название: Re: Взаимодействие между интерфейсом и консольной программой Отправлено: GrimmXXX от Октябрь 23, 2014, 17:46 Спасибо за пример.
Код: #include <QCoreApplication> Но вот переделал немного пример, но в окне QDebug выводится "* " а должен выводиться ответ 5. Название: Re: Взаимодействие между интерфейсом и консольной программой Отправлено: Old от Октябрь 23, 2014, 17:48 Спасибо за пример. Запускайте вместо bash сам интерпретатор.Название: Re: Взаимодействие между интерфейсом и консольной программой Отправлено: GrimmXXX от Октябрь 23, 2014, 17:56 Спасибо за пример. Запускайте вместо bash сам интерпретатор.Код: #include <QCoreApplication> Вот код. Извините, чувствую себя балбесом который не понимает простых вещей. В окне QDebug выводится просто ". Может попробовать выводить не в QDebug а в LXTerminal? Заранее извините за назойливость. Название: Re: Взаимодействие между интерфейсом и консольной программой Отправлено: Old от Октябрь 23, 2014, 18:23 Код
test.cl Код
Название: Re: Взаимодействие между интерфейсом и консольной программой Отправлено: GrimmXXX от Октябрь 23, 2014, 18:33 Спасибо, что уделяете время, но в окне все равно пустые кавычки.
Код: Starting /home/grimmxxx/build-Primer-Desktop-Debug/Primer... Название: Re: Взаимодействие между интерфейсом и консольной программой Отправлено: Old от Октябрь 23, 2014, 18:38 Спасибо, что уделяете время, но в окне все равно пустые кавычки. Вам нужно правильно установить рабочий каталог, что бы лисп мог находить файл со скриптом. Или указывайте полный путь до этого файла в параметрах.Название: Re: Взаимодействие между интерфейсом и консольной программой Отправлено: Old от Октябрь 23, 2014, 18:52 На самом деле использовать паймы это толльо один из возможных вариантов взаимодействия.
Программа на лиспе может писать результаты в файл или общую память, передавать через локальные или сетевые сокеты, работать через какой нибудь DBus. В общем вариантов много и они зависят от объемов этих результатов, необходимой интерактивности вычислений и личных предпочтений. :) Название: Re: Взаимодействие между интерфейсом и консольной программой Отправлено: GrimmXXX от Октябрь 23, 2014, 19:16 На самом деле использовать паймы это толльо один из возможных вариантов взаимодействия. Программа на лиспе может писать результаты в файл или общую память, передавать через локальные или сетевые сокеты, работать через какой нибудь DBus. В общем вариантов много и они зависят от объемов этих результатов, необходимой интерактивности вычислений и личных предпочтений. :) Может вы мне посоветуете тогда какой подход будет для меня оптимальным и ткнете в какую-то литературу? Программа на Лиспе проводит полный электродинамический анализ различных структур(вибраторы, антенны и т.д.), строит графики токов, 2D и 3D диаграммы направленности в gnuplotе. В идеале должно быть так: 1)Пользователь запускает программу, одновременно запускается sbcl в фоне. 2)Выводится окно которое содержит надписи, пустые поля для ввода и несколько кнопок. 3)Пользователь вводит в пустые поля нужные данные(параметры структуры). 4)После ввода нажимается кнопка и введенные данные отправляются в sbcl(в определенной форме записи конечно) 5)В конце пользователь нажимает кнопку что-то вроде "Расcчитать" и после расчета выходит окно gnuplot с необходимым ему графиком. Это все очень грубо и упрощенно,но суть думаю ясна. Название: Re: Взаимодействие между интерфейсом и консольной программой Отправлено: Old от Октябрь 23, 2014, 19:39 Самым лучшим для этого встроить интерпретатор лиспа в программу на C++.
Посмотрите на этот проект: http://ecls.sourceforge.net/ Или попробуйте найти аналоги. Название: Re: Взаимодействие между интерфейсом и конс&# Отправлено: GrimmXXX от Октябрь 29, 2014, 12:07 Если кому интересно, добился того чего хотел ;)
Программа тестовая, но вполне рабочая. Код: [b]myprocess.cpp[/b] Код: [b]myprocess.h[/b] При нажатии кнопки "StartSBCL" запускается собственно сам SBCL(можно запустить любую другую программу). Если ввести какую-то команду в Текстовое поле и нажать "Input Command", то эта команда выполнится в SBCl и ответ выведется в другое текстовое поле. Кнопка "(+ 3 2)" чисто для проверки, чтобы можно было вешать какой-то код заранее прописанный в программе. Теперь хочу ещё добавить пару текстовых полей для переменных, чтобы вводить не всю команду на lispe, а только значения переменных. Спасибо ещё раз за помощь. Название: Re: Взаимодействие между интерфейсом и консольной программой Отправлено: GrimmXXX от Ноябрь 02, 2014, 09:51 Возник ещё один вопрос, но новую тему решил не создавать.
Какой сигнал отвечает за запуск программы? Хотелось бы запускать процесс описанный выше, сразу при запуске программы, а не при нажатии кнопки "Start SBCL". Заранее, спасибо за ответ. Название: Re: Взаимодействие между интерфейсом и консольной программой Отправлено: Old от Ноябрь 02, 2014, 09:54 QProcess посылает сигнал started, когда дочерний процесс запустился.
Название: Re: Взаимодействие между интерфейсом и консольной программой Отправлено: Alexu007 от Ноябрь 02, 2014, 22:32 Если программы не сложные (хоть и для сложных матем. вычислений) - не проще скопировать код вычислений в оконное приложение? Нафига консоли и лишняя головная боль? Само оконное приложение с кнопками и вводом-выводом пишется в Qt за 5 минут.
|