Shell2Shell(Оболочка для оболочки) запуск SD и не только...

Обсуждаются как существующие проекты (перевод документации, информационная система и т.п.), так и создание новых.

Модератор: Модераторы

Shell2Shell(Оболочка для оболочки) запуск SD и не только...

Сообщение Alex2013 » 08.08.2023 15:42:55

Изображение

Начал делать самодельную "Оболочку для оболочки" Shell2Shell
(Пока пишу сугубо под винду но в принципе "это неточно" (поживем увидим ) )
Суть идеи в написании "универсального лаунчера"(Пускателя ) для проектов подобных "Автоматике 1111 Stable Diffusion".
(Возможно с плагинами, доступом АПИ и разной "гибридной технологии", которую лучше делать в виде обычной программы вместо того чтобы, лепить все подряд в веб-интерфейс (и питон-скрипты) (по сути это будет гибрид "NMKD Stable Diffusion GUI " и "Автоматики 1111") )


>>>Что даст это приложение,кроме вывода окна терминала? В чем отличие от обычной веб версии Автоматика ?
1 Выбор вариантов запуска (Причем одна программа сможет запускать множество разных оболочек с разными настройками)

2 Строго говоря пока что этот проект не имеет особой привязки ни к "Автоматике 1111" ни к SD
(можно запустить что угодно включая чисто онлайновые сервисы или на против сугубо консольные проекты)

3 Дико надоело то что нужно постоянно запускать браузер
("автоматический" пуск еще хуже так как вываливает все открытые окна, закладки и т.д.)

4 В ближайшем будущем сделаю парсинг консоли (терминала ) .

5 Часть вещей которых нет в веб-оболочке (или они сделаны очень неуклюже ) гораздо проще сделать в виде классической "монолитной" программы
(но с встроенными скриптами и плагинами).

6 Такую "оболочку для оболочки" по идее ничего не стоит научить полностью автоматической установке моделей и самой SD+""Автоматики 1111""

7 В дальнейшем можно сделать дополнительный "прямой доступ к API" что может вообще делать почти любые вещи на которые хватит фантазии.


Добавлено спустя 6 минут 23 секунды:
>>S2S_bin0_4_1.7z :idea:
Это разумеется не более чем ранняя альфа версия .
Но интересна идеей "инкапсуляции гибридных API" и созданием "интегральных" сборок разнородных сервисов .
"Захват консоли" идет в двух режимах "виртуальном"(в нем можно парсить консольный вывод ) и "реальном" ( обычная консоль "удочеренная" через SetParent )
"Экстренная остановка" выполняется через KillProcessTree (Все-бы хорошо да работает только в 32-х разрядном режиме )
Зы
"Виртуальная консоль" RunDosInMemo (Консольный вывод из "Автоматики 1111" изрядно наворочен и "обычный мемо" для него не слишком годится так что буду переделывать)
Код: Выделить всё
Procedure RunDosInMemo(CmdLine: String; AMemo: TMemo);
Const
    ReadBuffer = 1023;
Var
    Security: TSecurityAttributes;
    OutReadPipe, OutWritePipe: tHandle; // труба для output'a консольной проги.
    InReadPipe, InWritePipe: tHandle; // труба для input'a консольной проги.
    ErrReadPipe, ErrWritePipe: tHandle; // труба для error's консольной проги.
    // InReadPipe, ErrReadPipe и объявлены для полноты картины,но не создаются и не используются.
    start: TStartUpInfo;
    ProcessInfo: TProcessInformation;
    Buffer: Pchar;
    BytesRead: DWord;
    Apprunning: DWord;
    avail : dword;
    notread:dword;
    stop:boolean;
Begin
    stop := false;
    With Security Do Begin // инициализация структуры
        nlength := SizeOf(TSecurityAttributes);
        binherithandle := true;
        lpsecuritydescriptor := Nil;
    End;
    Createpipe(InReadPipe, InWritePipe, @Security, 0);
    Createpipe(ErrReadPipe, ErrWritePipe, @Security, 0);
    If Createpipe(OutReadPipe, OutWritePipe, @Security, 0) Then Begin
        // создали трубу для выхлопа бэкграунд-приложения
        Buffer := AllocMem(ReadBuffer + 1);
        // создали буфер для чтения
        FillChar(Start, Sizeof(Start), #0);
        // заполнили содержимое стартовой структуры #0
        start.cb := SizeOf(start);
        start.hStdOutput := OutWritePipe;
        start.hStdError := OutWritePipe;
        start.hStdInput := InReadPipe;
        (*************************************************************
            такой себе опширненьний комментарий...
            Оказывается, мать их так, если сделать перенаправление
            вывода в трубы, но не читать его, то если он(вывод)
            будет достаточно длинный и сможет переполнить буфер,
            который изначально отводится под трубу, то пишущий поток
            остановится и будет ждать пока не освободится место в
            буфере трубы. Как только оно освободилось, он сможет
            продолжать работу и писать дальше.
 
            start.hStdOutput := OutWritePipe;
            start.hStdError := OutWritePipe;
 
            почему собственно такой странный код: два потока
            перенаправлены в одну трубу?
            Потому что некоторые замечательные проги типа 7zip свой
            вывод направляют не в StdOut, а почему то в StdErr...
            и если для этих двух потоков назначить две разных трубы,
            а читать только одну, то произойдет то, что описано выше.
            РРРРРРРРРРРРРРРРРРРРРРРРР!!!!!!!!! сопли, слюни, ярость и
            буйное помешательство на почве программирования под винду.
 
            Может стоит сделать две трубы и читать каждую в отдельное
            мемо???
        **************************************************************)
        start.dwFlags := STARTF_USESTDHANDLES + STARTF_USESHOWWINDOW;
        start.wShowWindow := SW_HIDE;
        // окно прячем
 
        If CreateProcess(Nil, PChar(CmdLine), @Security, @Security, true, NORMAL_PRIORITY_CLASS,
            Nil, Nil, start, ProcessInfo) Then Begin
            // создали процесс
            Repeat
                Apprunning := WaitForSingleObject(ProcessInfo.hProcess, 100);
                PeekNamedPipe(OutReadPipe, @Buffer[0], ReadBuffer, @BytesRead, @avail, @notread);
                // PeekNamedPipe копирует из буфера трубы и оставляет его в первоначальном состоянии
                // в то время как ReadFile читая из трубы - опустошает ее.
                // PeekNamedPipe можно использовать для того чтобы узнать сколько данных есть в трубе
                // и если в PeekNamedPipe передать 2 и 3 параметры пустыми, то она просто скажет
                // сколько данных есть в трубе
                if avail > 0 then begin
                    ReadFile(OutReadPipe, Buffer[0], BytesRead, BytesRead, Nil); // *******
                    // ReadFile при чтении из трубы опустошает ее(трубы) буфер.
                end
                else begin
                    if Apprunning <> 258 then
                        stop := true;
                end;
                // читаем через читающий конец трубы из вывода консоли
                Buffer[BytesRead] := #0;
                // последний символ #0 - конец буфера
                OemToAnsi(Buffer, Buffer);
                // перевели из кодировки DOS в кодировку WIN
                AMemo.Text := AMemo.text + String(Buffer);
                // то что прочитали приписали к тексту в мемо
                Application.ProcessMessages;
                // обработали очередь сообщений
//            Until ((Apprunning <> WAIT_TIMEOUT) or (avail < 0));
            Until stop;
            // прервемся когда процесс завершится
        End;
        FreeMem(Buffer); // освободили буфер
        CloseHandle(ProcessInfo.hProcess); // закрыли все хендлы
        CloseHandle(ProcessInfo.hThread);
        CloseHandle(OutReadPipe);
        CloseHandle(OutWritePipe);
        CloseHandle(InReadPipe);
        CloseHandle(InWritePipe);
        CloseHandle(ErrReadPipe);
        CloseHandle(ErrWritePipe);
    End;
    // конец.
End;

Зы Зы
В качестве "браузерного движка" для веб-интерфейсов использован WebView4Delphi + Microsoft Edge WebView 2
Последний раз редактировалось Alex2013 24.08.2023 10:33:17, всего редактировалось 6 раз(а).
Alex2013
долгожитель
 
Сообщения: 2957
Зарегистрирован: 03.04.2013 11:59:44

Re: Shell2Shell(Оболочка для оболочки)запуск SD и не только.

Сообщение Alex2013 » 10.08.2023 15:45:06

Свежая сборка "Оболочки для оболочки"
Изображение
:arrow: S2S_bin0_4_4.7z :idea:
Много мелких правок и интересная "Эмуляция нажатия CTRL+C"
Код: Выделить всё
procedure TForm1.Button1Click(Sender: TObject);
procedure CtrlC;
begin
keybd_event(VK_CONTROL,0,0,0);
keybd_event(VK_C,0,0,0);
keybd_event(VK_C,0,KEYEVENTF_KEYUP,0);
keybd_event(VK_CONTROL,0,KEYEVENTF_KEYUP,0);

end;
Var
   StartTime:QWord;

  begin
    if  windows.IsWindow(con_h)
      then begin
       ShowWindow(Con_H,sw_restore);
         BringWindowToTop(Con_H);
         windows.SetFocus(Con_H);
       CtrlC;
{
  KeyInput.Apply([ssCtrl]);
  KeyInput.Press('C');
  KeyInput.Unapply([ssCtrl]);
}

end
end;


Добавлено спустя 23 часа 42 минуты 41 секунду:
Re: Shell2Shell(Оболочка для оболочки)запуск SD и не только...
Изображение
>>Доступ к Web VR на базе проги Shell2Shell

Краткая Инструкция. ( для тех кто уже запускал Shell2Shell )
Распаковать архив в отдельную папку запускать Shell2Shell_х32.exe
Выбрать вариант и нажать пуск ( возможно сервер не успеет запустится так нужно надавить кнопку "Обновить" (в браузере) или "Go".)
Для нормального завершения просмотра обязательно тыкнуть в консоль и нажать "любую кнопку."
( Иначе веб-сервер останется в памяти и субст не вернет "букву Икс" )

Если есть реальный ВиАр шлем можете пробовать перейти режим виртуальности (Ткнув в значок очков) если нет можно просто крутить "панорамы 360 градусов" мышкой зажав левую кнопку.


Для этого форума возможно будет интересен "хитроумный" способ работы с простым веб-севером .
Код: Выделить всё
@echo off
: Создаю "временный диск" .
subst X: .
: Запускаю "минимальный" сервер tiny.exe в отдельном потоке
start tiny.exe X:\ 80 127.0.0.1
:"Рабочая пауза"
pause
:Останавливаю процесс сервера
Taskkill /IM tiny.exe  /F
:Освобождаю "Букву диска"
subst X: /D
Последний раз редактировалось Alex2013 06.10.2023 03:34:02, всего редактировалось 4 раз(а).
Alex2013
долгожитель
 
Сообщения: 2957
Зарегистрирован: 03.04.2013 11:59:44

Re: Shell2Shell(Оболочка для оболочки)запуск SD и не только.

Сообщение Alex2013 » 12.08.2023 21:36:09

Прикрутил 3д-редактор от A-Frame
Изображение
Изображение
>>A-Frame_2.7z :idea:

(Использована исходная версия A-Frame так что требуется интернет( откуда стягиваются JS-библиотеки ) но ее вполне можно переделать для локального запуска )
Зы
Попытка разделить включение/выключение сервера и просмотр непонятно почему с треском провалилась.
Сервер раз за розом "падает" при выборе другого варианта просмотра хотя при "раздельном запуске" все тип-топ ...
Интересно в чем там может быть дело ? :roll:
(См версию с "глюком" :?: )

Зы Зы
Кстати никто не знает более надежный консольный Веб-сервер под винду ? ( Написать свой не проблема но пока лениво )
Alex2013
долгожитель
 
Сообщения: 2957
Зарегистрирован: 03.04.2013 11:59:44

Re: Shell2Shell(Оболочка для оболочки)запуск SD и не только.

Сообщение Alex2013 » 23.08.2023 17:55:03

Shell2Shell Версия сборки 0.4.5

:arrow: S2S_bin0_4_5.7z :idea:

Изображение
Изображение

Ни шатко невелико прикрутил "Custom Titlebar" , полноэкранный режим и опцию "автопереход" для онлайн сервисов .
( В начале пытался добавить отдельный "хук на мышку"(для вызова "системного меню мышкой" (ИМХО) потому что "хороший тон" это когда управлять основными функциями можно не только "без мышки" но и одной мышкой "без клавиатуры" ) но потом вспомнил он уже по сути есть в "Custom Titlebar" )
Зы
Практика показала что возращение из полно экранного режима все равно пока имеет "слепые зоны" но три разных способ "восстановления оконного режима" в целом перекрывают возможные коллизии.
3ы Зы
При подключение "Custom Titlebar" почему перестала работать опция формы Form.Position := poDefault так что пришлось использовать " уцененную версию" Form.Position := poScreenCenter , а размеры окна при старте вычислять самостоятельно.
Alex2013
долгожитель
 
Сообщения: 2957
Зарегистрирован: 03.04.2013 11:59:44

Re: Shell2Shell(Оболочка для оболочки) запуск SD и не только

Сообщение Alex2013 » 01.09.2023 19:44:41

Shell2Shell Версия сборки 0.4.6
Кодовое имя «Париж».
:arrow: S2S_bin0_4_6.7z :idea:
Изображение
О "новых технологиях " смотрите в теме Мониторинг консольного вывода без перехвата

Что вообще нового в этой сборке:
1 Улучшенный интерфейс "полноэкранного" режима (Кнопка "FS" в заголовке окна)
(Выход из режима — ESC (если фокус окна не в веб-интерфейсе (а например в адресной строке) или через "Системное меню"- (курсор в левый верхний угол экрана или Alt-Space)Кликнуть на "Восстановить"))
+ так-же улучшена «Максимизация окна» (белый квадратик в заголовке окна)

2 Режим "Поиска строки в терминале" (Мониторинг терминала)
При нахождении строки можно задать следующие действия:
1 'Передать Ctrl+C'
2 'Выдать сообщение'
3 'Освежить браузер' (Перезагружает страницу в веб-интерфейсе)
4 'Режим ожидания ' (Отключает браузер и включает заставку)
6 'Запустить утилиту'
Периодичность проверки можно изменить.

Поиск происходит сверху вниз по списку однократно и последовательно.

3 Сменил стартовую страницу .
Зы
Самое сложное в этой сборке для меня было, как ни странно, согласовать внезапно ставший "двухуровневым" диалог настройки.
На разные "хитроумные" костыли приделанные к "мониторингу" моей бестоковой головы хватало, а как полезла типа прямая "комбинаторика" так сразу "Караул, спасайтесь кто может!". :idea: :wink:
Alex2013
долгожитель
 
Сообщения: 2957
Зарегистрирован: 03.04.2013 11:59:44

Re: Shell2Shell(Оболочка для оболочки) запуск SD и не только

Сообщение Alex2013 » 08.09.2023 17:58:24

Добавил "постоянный мониторинг" и "перетасовку Ini-файла".
Обе фичи оказались довольно "наукоемкие" ( в смысле что возни неожиданно много ).
1 "Постоянный мониторинг" понятное дело еще раз усложнил логику поддержки диалога настройки.
2 Кроме этого усложнился сам мониторинг и подготовка данных .
3 Перетасовку ini-файла делал для "синхронизации" конфига и его внешнего вида. Сделал грубо но надежно ( просто пересобрал в памяти "как текст" и записал в файл )
Зачем? Конфигурацию можно править вручную и если её вид в оболочке будет не совпадать с файлом это может неслабо запутать. Но прикол был в том, что в начале , я пытался "хакуть" исходный класс (TIniFile) или найти ему адекватную замену. ( Вообщем не делайте так - задача такой возни точно не стоит )
4 "Постоянный мониторинг" серия 2. "Отладка" Уф! Во первых прибил кучу ошибок класса "привет лень матушка" и "куда смотрели мои глаза батюшка". Во вторых оказалось что модный фокус с потоком (через TThread.Queue) ничерта не работает так как это ожидалось. Вообщем пришлось " по старинке" делать отдельный поток под каждую задержку для очистки транспаранта (Можно было и через таймеры но у меня их и так там целая куча ) .

Изображение
Alex2013
долгожитель
 
Сообщения: 2957
Зарегистрирован: 03.04.2013 11:59:44

Re: Shell2Shell(Оболочка для оболочки) запуск SD и не только

Сообщение Alex2013 » 24.09.2023 20:32:37

Наконец сделал более мнение работающие "вложенные разделы".
Опять "гладко было на бумаге да да забыл про овраги!" :idea:

Изображение
Не красиво но полезно ! ( Ну еще часики добавил что бы "не подвисать" по ночам)

Теперь протестировать с реальной "Стабильной диффузии" и прочих "нейроматичеких примочках" и можно выкладывать очередной "альфа тест" :idea:
Alex2013
долгожитель
 
Сообщения: 2957
Зарегистрирован: 03.04.2013 11:59:44

Re: Shell2Shell(Оболочка для оболочки) запуск SD и не только

Сообщение Alex2013 » 03.10.2023 11:52:50

Бр " О сколько нам открытий "чудных" готовит лени вредный дух!". В общем народ, никогда не храните данные в диалогах. Вроде банальность, но "логика лени" постоянно подзуживает "Зачем тебе дополнительные структуры данных, если все данные уже лежат в памяти? Бери и пользуйся" Ну да ну да, вот только многие визуальные компоненты сделаны на базе WinApi и их реальное поведение и никогда заставляет вспомнить о парадоксах квантовой механики . (Например если диалог скрыт то при обращении к его элементам (причем даже при "простом" чтении их состояния) возможны совершенно невероятные вещи ( вроде изменения (или "не изменения" если это нужно ) состояния чекбоксов застревания данных в полях ввода или их "запутанность", не реальная "отложенная загрузка" после инициализации, но до показа диалога). Нет, в принципе это логично, логика работы диалога проста "вот он есть, а вот его нет" , прикол в том что так себя ведет даже немодальный диалог. То есть если он скрыт его в состояние влезает некая "квантовая неопределенность" (особая "прелесть" ситуации в том что при этом до какого-то момента все может работать "как часы") плюс эта "неопределенность" может заметно усиливается если программе есть разные не стандартные фокусы с WinApi.

Но даже если вы пользуетесь диалогом и вообще визуальные элементы только стандартно не особо полагайтесь на данные сохраненные внутри их полей . То есть не ленитесь делать отдельные переменные независящие от капризов WinApi. Разумеется это потребует нескольких "лишних" строк для отслеживания состояния и синхронизации данных, но по идее это может спасти от целой тучи неприятностей ! :idea:


Изображение
Изображение
(Это неправильная сборка с кучей костылей из серии "зомби тоже может играть в волейбол" :mrgreen: Но надеюсь что следующая будет лучше так как причины появления "зомбиленда" наконец обнаружены )

>>>S2S_bin_0_4_7_fix2.7z :idea:

Зы
Особый прикол в том, что в процессе отладки деталей часто "за деревьями леса не видно " .
Alex2013
долгожитель
 
Сообщения: 2957
Зарегистрирован: 03.04.2013 11:59:44

Re: Shell2Shell(Оболочка для оболочки) запуск SD и не только

Сообщение Alex2013 » 13.12.2023 22:28:24

Свежая сборка на 4PDA...
"Оболочки для оболочка" Shell2Shell
Костыли связанные с данным в диалогах убрал .
Alex2013
долгожитель
 
Сообщения: 2957
Зарегистрирован: 03.04.2013 11:59:44


Вернуться в Разное

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 25

Рейтинг@Mail.ru