Forth http://www.fforum.winglion.ru/ |
|
Quark C64 http://www.fforum.winglion.ru/viewtopic.php?f=23&t=3165 |
Страница 3 из 4 |
Автор: | zma [ Вт фев 12, 2019 09:46 ] |
Заголовок сообщения: | Re: Quark C64 |
Hishnik писал(а): Да, это получается вариант п.3 - продублировать адресный интерпретатор еще и в методе класса MainWindow. Собственно, это просто copy-paste, но вроде бы должно сработать. Как раз дублирования не будет. Получится что-то такое: Код: int finished;
... for (finished = Evaluate("SOME-FORTH"); !finished; finished = ResumeForth()) { // перерисовка элементов окна } |
Автор: | Hishnik [ Вт фев 12, 2019 19:49 ] |
Заголовок сообщения: | Re: Quark C64 |
Пока вот так: Код: void MainWindow::Run() { const char * str = new char [256]; QString s; s = Console->text(); str = s.toLocal8Bit().constData(); strncpy(Tib, str, MAXNAMELEN - 1); QFuture<void> f1 = QtConcurrent::run(EvaluateTib); Console->setText(""); while (!(f1.isFinished())) {} QString info = QString::number(Depth); if (Depth > 0) info = info + " : " + QString::number(Dstack[Depth - 1]); StackInfo->setText(info); } Предполагаю сделать из форт-машины отдельную очередь, проверять ее внутри while, и при наличии команд просто отрисовывать их. Минус в том, что придется реализовать отдельный набор сообщений и параметров, зато так удается избавиться от чрезмерно глубокого проникновения друг в друга Qt и Форта. В принципе, на основе потока сообщений из Форта в вызывающую программу можно и другие внешние фреймворки использовать. |
Автор: | Hishnik [ Ср фев 13, 2019 04:28 ] |
Заголовок сообщения: | Re: Quark C64 |
Да! Оно (пока) получается так, как я хочу. Очередь, реализованная в форт-машине, кладет туда пакет из параметров. Параметры надо, конечно, расписывать отдельно, и вообще придумывать для них какую-то систематизацию, потому что по сути это дублирующееся перечисление свойств виджетов. Сейчас это: message (номер действия), object (номер типа объекта - увы, надо, чтобы избежать каких-то игр с преобразованиями типов в рантайме), index (это просто номер из внутренней БД программы). Дальше идут собственно параметры виджетов, пока этот объем не превысит разумные пределы. Очевидно - XYWH, т.е rect, дальше можно уже caption, checked, наличие рамок и т.д., т.е. придется, конечно же, все делать вручную. Форт-машина имеет слова, которые укладывают в очередь сообщений пакеты со всем перечисленным. Т.е., например, так: Код: void ForthButtonShow() { GMessage = SHOW; GObject = BUTTON; Depth--; GIndex = Dstack[Depth]; PushGUI(); } В вызывающей программе после запуска потока с форт-машиной проверяется эта очередь, и при наличии в ней сообщения оно разбирается. Сначала по типу объекта, потом каждый объект самостоятельно определяет, какие сообщения для него доступны. Будет дублирование (например, show/hide или setGeometry надо повторять для каждого типа виджета), зато новый виджет добавляется "концентрированно", а не размазыванием кода по нескольким обработчикам. Главное, собственно, проверил. Код: 0 BUTTON.SHOW 0 50 200 50 0 BUTTON.RECT На форме новая кнопка. Показывать/прятать и перемещать можно прямо из консоли. |
Автор: | Hishnik [ Чт фев 14, 2019 04:22 ] |
Заголовок сообщения: | Re: Quark C64 |
Ну, кажется, дело сдвинулось с мертвой точки. Код: " +" 0 BUTTON.ACTION Кнопке можно назначить строку Форта, которая должна исполниться при ее нажатии. Нужно еще разобраться с передачей параметров в системе "сигнал-слот" в Qt, потому что кнопок много, и в слот нужно оформить передачу номера кнопки, которая нажата. Больше всего радует, что весь интерфейс собирается прямо на ходу, в рантайме. |
Автор: | Hishnik [ Сб фев 16, 2019 22:33 ] |
Заголовок сообщения: | Re: Quark C64 |
Код: 0 BUTTON.SHOW 100 100 75 25 0 BUTTON.RECT " +" 0 BUTTON.TEXT " +" 0 BUTTON.ACTION 1 BUTTON.SHOW 100 140 75 25 1 BUTTON.RECT " -" 1 BUTTON.TEXT " -" 1 BUTTON.ACTION Уф, кажется, принципиальный шаг отвоеван у Qt. Вопрос был в том, что при наличии MAXBUTTONS кнопок (потенциально на форме, а не в конкретный момент), каждая кнопка генерирует сигнал (в терминах Qt). Покопавшись в рекомендациях, я нашел довольно хорошо подходящий к ситуации QSignalMapper, который преобразует сигналы от многих компонентов в сигнал другого типа, куда можно подмешать еще и номер компонента, который этот сигнал генерирует. Иначе clicked() никак не помогал понять, как из кнопок нажата. Код: for (int i = 0; i < MAXBUTTONS; i++) { FButton[i] = new QPushButton(this); FButton[i]->hide(); signalButtonMapper->setMapping(FButton[i], i); connect(FButton[i], SIGNAL(clicked()), signalButtonMapper, SLOT(map())); } connect(this, SIGNAL(ButtonClicked(int)), this, SLOT(ButtonClick(int))); Вот теперь после того, как все кнопки подключились к mapper-у, передав ему дополнительно свой номер, можно сгенерировать сигнал ButtonClick с номером кнопки. Но ощущение от сборки GUI прямо в рантайме (причем каждая кнопка тут же начинает работать по прямому назначению) - непередаваемо |
Автор: | Hishnik [ Вт фев 19, 2019 04:52 ] | ||
Заголовок сообщения: | Re: Quark C64 | ||
Вот пока так...
|
Автор: | zma [ Вт фев 19, 2019 08:41 ] |
Заголовок сообщения: | Re: Quark C64 |
Главное меню тоже через Форт настраивается? |
Автор: | VoidVolker [ Вт фев 19, 2019 13:03 ] |
Заголовок сообщения: | Re: Quark C64 |
Выглядит круто! А билды для ОСХ и линукса будут же, да? А как на счет компиляции программы в бинарный вид, чтобы не тащить исходник? Жду релиза |
Автор: | Hishnik [ Вт фев 19, 2019 17:22 ] |
Заголовок сообщения: | Re: Quark C64 |
zma писал(а): Главное меню тоже через Форт настраивается? Да, в принципе, все динамически создаваемые виджеты Qt можно создавать из Форта. Другое дело, что система сигнал-слот требует отдельной настройки, и для меню получается чуть сложнее. VoidVolker писал(а): Выглядит круто! А билды для ОСХ и линукса будут же, да? А как на счет компиляции программы в бинарный вид, чтобы не тащить исходник? Жду релиза Qt для Линукса есть, билд наверное будет. Для OSX ни разу не требовалось. А компиляция как раз не предполагается, потому что теряется смысл ВМ с кодом, не зависящим от платформы. К тому же общая идея как раз в том, чтобы проекты были максимально интерактивными, и можно было править GUI или из консоли, или крупно, редактированием скрипта. |
Автор: | VoidVolker [ Вт фев 19, 2019 22:42 ] |
Заголовок сообщения: | Re: Quark C64 |
Код: Qt для Линукса есть, билд наверное будет. Для OSX ни разу не требовалось. А компиляция как раз не предполагается, потому что теряется смысл ВМ с кодом, не зависящим от платформы. К тому же общая идея как раз в том, чтобы проекты были максимально интерактивными, и можно было править GUI или из консоли, или крупно, редактированием скрипта. Билд самого приложения для любой ОС все равно будет зависеть от ОС. Смысл таки как раз и не теряется: один раз написал код, собрал бинарник/бинарники, упаковал все в установщик/архив и отдал пользователям или загрузил небольшой файл на сервер обновлений. При этом совсем не хочется давать пользователям доступ к исходному коду приложения, который может являться интеллектуальной собственностью или просто требуется иметь закрытый исходный код. На мой взгляд, эта функция вообще никак не влияет на смысл приложения. |
Автор: | Hishnik [ Вт фев 19, 2019 22:58 ] |
Заголовок сообщения: | Re: Quark C64 |
VoidVolker писал(а): Билд самого приложения для любой ОС все равно будет зависеть от ОС. Смысл таки как раз и не теряется: один раз написал код, собрал бинарник/бинарники, упаковал все в установщик/архив и отдал пользователям или загрузил небольшой файл на сервер обновлений. А что делать с x86/ARM? Сейчас forth.h прекрасно собирается и под ARM (причем и в варианте bare metal). Для этого нужно, чтобы исходные тексты компилировались ну хотя бы в ШК, а оттуда все достаточно легко можно достать. VoidVolker писал(а): При этом совсем не хочется давать пользователям доступ к исходному коду приложения, который может являться интеллектуальной собственностью или просто требуется иметь закрытый исходный код. Приложение может иметь и дополнительный код на Qt, собранный для конкретной ОС. Форт нужен именно для того, чтобы расширять возможности пользователя - например как nnCron. |
Автор: | VoidVolker [ Ср фев 20, 2019 10:29 ] |
Заголовок сообщения: | Re: Quark C64 |
Hishnik писал(а): А что делать с x86/ARM? Сейчас forth.h прекрасно собирается и под ARM (причем и в варианте bare metal). Для этого нужно, чтобы исходные тексты компилировались ну хотя бы в ШК, а оттуда все достаточно легко можно достать. А, да, арм же еще есть. А во что сейчас компилируется? Сразу в инструкции процессору? Вообще, как внутри реализуется форт в этой новой версии кварка? Если не секрет, конечно. Hishnik писал(а): Приложение может иметь и дополнительный код на Qt, собранный для конкретной ОС. Форт нужен именно для того, чтобы расширять возможности пользователя - например как nnCron. Это-то да, но вот мне не нравится писать на С — поэтому и не использую Qt, а вот на форте нравится. Соответственно форт в Qt — это круто и интересно. На форте и общая логика приложения тоже вполне отлично реализуется, а благодаря его скорости и компактности даже сложный GUI будет работать быстро. Ну и плюс кроссплатформенность, да. Кстати, могу потестировать работу нового кварка с 4к/HiDPI, если что. |
Автор: | Hishnik [ Ср фев 20, 2019 19:23 ] |
Заголовок сообщения: | Re: Quark C64 |
VoidVolker писал(а): Сразу в инструкции процессору? Вообще, как внутри реализуется форт в этой новой версии кварка? Если не секрет, конечно. Внутри адресный интерпретатор. Но это все совсем не имеет машинных кодов. Код: void Step() { void(*fword)(); fword = (void(*)())ReadCode(pc); pc += sizeof(CELL); fword(); } void Execute() { CELL RdepthOnEntry = Rdepth; do { Step(); } while (RdepthOnEntry <= Rdepth) ; } VoidVolker писал(а): Это-то да, но вот мне не нравится писать на С — поэтому и не использую Qt, а вот на форте нравится. Соответственно форт в Qt — это круто и интересно. На форте и общая логика приложения тоже вполне отлично реализуется, а благодаря его скорости и компактности даже сложный GUI будет работать быстро. Ну и плюс кроссплатформенность, да. В переходе к Форту и состоит основная цель. На Qt делается то, что "пишется один раз", а вот размеры виджетов, положение, текст, да и действие - это все меняется от проекта к проекту и даже в рамках модификаций одного проекта. Поэтому Форт нужен в роли консоли для управления виджетами. Конечно, тут будет некоторое подмножество Qt, а не универсальный интерфейс ко всей библиотеке. До широкого тестирования еще далеко, конечно. Тут и так много интересного вылезает. |
Автор: | VoidVolker [ Ср фев 20, 2019 23:36 ] |
Заголовок сообщения: | Re: Quark C64 |
Ага, в целом понятно. Думаю, компиляции в ШК и проходом каким-нибудь шифром сверху для большинства задач упаковки приложения будет вполне достаточно. Hishnik писал(а): На Qt делается то, что "пишется один раз", а вот размеры виджетов, положение, текст, да и действие - это все меняется от проекта к проекту и даже в рамках модификаций одного проекта Это да, тут полностью согласен. Какие еще ожидаются новые функции по сравнению с предыдущей версией кварка? А как работает и взаимодействует виртуальный экрана совместно с Qt и его виджетами? Я так понимаю Qt создает этот виртуальный экран и отдает его кварку? При этом в него можно рендерить как OpenGL и отдельные пиксели как раньше, так и виджеты Qt? Или это несколько разных слоев? |
Автор: | Hishnik [ Ср фев 20, 2019 23:48 ] |
Заголовок сообщения: | Re: Quark C64 |
VoidVolker писал(а): Думаю, компиляции в ШК и проходом каким-нибудь шифром сверху для большинства задач упаковки приложения будет вполне достаточно. В целом там форт-машина упакована в два массива - код и данные. Если их сохранить и потом загрузить, компиляцию можно будет пропустить. Правда, возможен вариант, когда при старте будет генерироваться много данных, и попытка записи непомерно раздует сохраняемые файлы. VoidVolker писал(а): Какие еще ожидаются новые функции по сравнению с предыдущей версией кварка? А как работает и взаимодействует виртуальный экрана совместно с Qt и его виджетами? Я так понимаю Qt создает этот виртуальный экран и отдает его кварку? При этом в него можно рендерить как OpenGL и отдельные пиксели как раньше, так и виджеты Qt? Или это несколько разных слоев? Свой экран есть у форт-машины, его можно достать в Qt при необходимости. Виджеты создаются движком Qt, но их параметрами управляет форт-машина. Наложение виджетов на экран Форта может быть некоторой проблемой из-за особенностей отрисовки, но можно будет делать виджет "изображение" и связывать его с экраном Форта. |
Страница 3 из 4 | Часовой пояс: UTC + 3 часа [ Летнее время ] |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |