IUP тоже интересная (судя по галерее). Еще был VxWidgets, но у меня почему-то не собрался. В принципе, подобные вещи вполне ценны самим фактом существования, и если туда будет подключаться Форт, это дополнительный плюс.
Сейчас тот вариант, который я пишу, не то чтобы жестко привязан к Qt. До этого консоль + OpenGL завелось на Eclipse + mingw и варианте gcc для ARM в ПЛИС Zynq-7000. То есть плюс в виде "форт-машина собирается с разными вариантами Си" имеет место, и я бы хотел его сохранить. Думаю, это вообще интересный вариант, если форт-машину можно будет подключать к Си-проектам просто "на всякий случай" без существенного вмешательства в их архитектуру.
Для Qt я, конечно, в основном экспериментирую. Строки из Си уже вполне передаются в форт-машину, выполняются там, результаты можно забирать (все объекты форт-машины в области видимости проекта и можно смотреть стек, память, программу и т.д.). То, что я хочу сделать, уже несколько за этими пределами. Управление виджетами из форт-машины как таковое уже работает, потому что можно опрашивать все из Qt и устанавливать свойства виджетов по состоянию переменных, заданных форт-машиной. Это как раз не проблема. Проблема заключается в том, что если установка переменных производится отдельными строчками, результат виден на экране сразу. А вот если Evaluate запускает не "показать кнопку", а "запустить программу", то все изменения будут отражены после завершения Evaluate, т.е. результат будет только после отработки всего кода на Форте. Если это что-то вроде RUN, запускающего длительный расчет, то ни progress bar, ни возможности отмены, ни обновления графиков в реальном времени не будет. Пока тут несколько вариантов.
1. Кардинальный - "не выбрасывать ручечку" (с) Задорнов. Строки передаются в интерпретирующем режиме, тогда после каждой строки можно будет обновить GUI. Но это крайне неудобно, к тому же возникает проблема с загрузкой файлов - это же одна команда, которая загружает строки сама. Вобщем, вариант слишком уж компромиссный. 2. Форт-машина получает методы GUI в виде своих слов. То, что, собственно, не получается, потому что экземпляра MainWindow еще нет, и требуется "позиционная война" с компилятором, чтобы заставить его после создания главного окна найти адреса его методов и передать их форт-машине в виде CELL. И в перспективе придется еще организовать прокачку сообщений. 3. То, что чуть отложено, поскольку кажется некрасивым. Вызывающая система дублирует Evaluate и самостоятельно организует обработку строк, пользуясь при необходимости функциями форт-машины. При этом такое MainWindow::Evaluate будет уже методом главного окна, со всеми вытекающими возможностями доступа к своим виджетам. Получится некоторое дублирование функций (что и вызывает эстетическое недовольство), к тому же придется обеспечивать отдельную обработку слов, управляющих виджетами. Возможно, вплоть до хранения их списка в вызывающей программе, со специальными признаками, обеспечивающими обработку сообщений, если уж изменен виджет. Видимо, и многопоточность здесь уже не так принципиальна.
|