Держать %COMSPEC% живым, скармливая ему команды

Здесь обсуждаются проблемы мироустройства.
User avatar
DrKnS
Posts: 6114
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 12 times
Been thanked: 426 times

Держать %COMSPEC% живым, скармливая ему команды

Post by DrKnS »

Xerox wrote: Sat 16 Nov, 2019 17:49 нет никакой причины и не логично запускать %ComSpec% каждый раз, а не держать его живым скармливая ему команды, но это исторически сложившуюся концепцию переделывать теперь
Ой, а расскажете, как же их правильно скармливать? Прямо интересно стало.
Last edited by HaRT on Sun 17 Nov, 2019 16:36, edited 1 time in total.
Reason: Подправлен заголовок Темы
User avatar
Xerox
Posts: 395
Joined: Sun 20 Oct, 2019 15:50
Has thanked: 354 times
Been thanked: 9 times

усовершенствовать дерево директорий

Post by Xerox »

DrKnS, Да довольно просто, сейчас я расскажу как это в Dot.Net можно, но принцип будет тот же с любым другим адекватным языком.
Last edited by Xerox on Sat 16 Nov, 2019 23:24, edited 1 time in total.
User avatar
Xerox
Posts: 395
Joined: Sun 20 Oct, 2019 15:50
Has thanked: 354 times
Been thanked: 9 times

усовершенствовать дерево директорий

Post by Xerox »

Блин!! Написал целую статью, но Хром на работе к чертям вылетел, зла не хватает (посоны, не пользуйтесь хромом!)
Пока оставлю это так, если кому-то будет интересно но непонятно, то накатаю еще раз статью.

Code: Select all

Process p1 = new Process("cmd.exe", "<whatever-params-if-needed>");
p1.StdIn.WriteLine("echo Hello world!")
string s1 = p1.StdOut.ReadLine();
Концептуально это так (но код нерабочий, - это больше псевдокод).
Т.е. прога делает хостинг для CMD, или любого другогp приложения, у кого есть StdIn, StdOut, StdErr, - у всех консольных это есть.
(но и неконсольные тоже могут читать/писать в потенциале)

Проблема чтобы применить для ФАРа - это будет конкретный редизайн/рефактор, я предполагаю что.
Исторически всегда так было, все привыкли-смирились, за отсутствием чего получше в первую очередь.
Странно что Рошаль изначально не сделал хостинг CMD, вродь не так сложно на начальной стадии реализовать, а на конечных стадиях
наоборот заколебшься переделывать.
С другой стороны понятно что усилия редко вознаграждаются и времени ни у кого нет

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


Интересно вот что, как сделать хостинг в ФАРе допустим, если помечтать.
Логичнее всего, не доверять внешним макросам/плагинам, в самом ФАРе сделать, так как это critical core functionality.
И думаю что технически легче, там С++, все путем.
Но в целом, теоретически, можно и через плагин, с ущербом для производительности конечно.
А интересно вот что, тот усеченный ЛУА который в ФАР язык скриптинга, может ли поддерживать обьект Process?
Сейчас кажется что не может, но насколько возможно добавить туда этот обьект?
Можно, конечно, написать скрипт ЛУА который будет интерфейситься уже с самим cmd-wrapper написаном хоть на чем, но это уже будет совсем пичаль-бяда с точки зрения производительности и устойчивости всей конструкции.
Last edited by Xerox on Sun 17 Nov, 2019 00:10, edited 8 times in total.
User avatar
DrKnS
Posts: 6114
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 12 times
Been thanked: 426 times

усовершенствовать дерево директорий

Post by DrKnS »

Xerox wrote: Sat 16 Nov, 2019 23:20StdIn, StdOut, StdErr
Чем посылание stdin куда попало концептуально отличается от посылания нажатий клавиш куда попало?
Как определить, что процесс готов к приёму ввода?
Как определить, что процесс закончил обработку ввода?
Как определить, что ожидается дополнительный ввод?
Как узнать результат?
Как определить, что процесс закончил вывод?
Как впихнуть в stdout невпихуемое (вывод far.exe, например)?
вродь не так сложно
Не сложно - делайте.
User avatar
Xerox
Posts: 395
Joined: Sun 20 Oct, 2019 15:50
Has thanked: 354 times
Been thanked: 9 times

усовершенствовать дерево директорий

Post by Xerox »

DrKnS, oчень хорошие и правильные вопросы, отвечу на все, буду ли делать - очень хочется, но вряд ли
Итак
Чем посылание stdin куда попало концептуально отличается от посылания нажатий клавиш куда попало?
не, когда ты пишешь в stream, то что ты пишешь никуда не денется, это как писать в файл - базовая операция, работает предсказуемо как молотком по башке.
и например если c файлoм проблема, то ты получаешь exception с четким описанием проблемы - например "Этот чувак надел каску".

А когда ты шлешь нажатия - это совсем другая история, ты их действительно шлешь в пустоту и не можешь ни на что особо рассчитывать.
Концептуальноe отличие тут в том, что писать в stream это ну как запись файла, самая базовая и надежная операция из всех, - stateful
А слать нажатия - это "послать сообщение голубиной почтой" очень ненадежному канал, практически stateless

Огромный зазор с помехами между посылающим и принимающей стороной,
тогда как с файловыми операциями зазора считай что нет, тем более когда "файл" сидит у тебя же в памяти апликации
Last edited by Xerox on Sun 17 Nov, 2019 01:41, edited 3 times in total.
User avatar
Xerox
Posts: 395
Joined: Sun 20 Oct, 2019 15:50
Has thanked: 354 times
Been thanked: 9 times

усовершенствовать дерево директорий

Post by Xerox »

Как определить, что процесс готов к приёму ввода?
У Stream (=StdIn/StdOut/StdErr) (= файл) есть статус, типа открыт/закрыт/существует, его размер, чем и пользуемся
User avatar
Xerox
Posts: 395
Joined: Sun 20 Oct, 2019 15:50
Has thanked: 354 times
Been thanked: 9 times

усовершенствовать дерево директорий

Post by Xerox »

Как определить, что процесс закончил обработку ввода?
Ты опрашиваешь, например раз в секунду, или чаще если надо, можно ли прочитать чего из StdOut?
(Или там кажется есть event на то)
Если есть чего читать (размер > 0), то читаем пока не получаем EndOfStream, и ждем дальше.
Last edited by Xerox on Sun 17 Nov, 2019 00:53, edited 1 time in total.
User avatar
Xerox
Posts: 395
Joined: Sun 20 Oct, 2019 15:50
Has thanked: 354 times
Been thanked: 9 times

усовершенствовать дерево директорий

Post by Xerox »

Как определить, что процесс закончил обработку ввода?
В простейшем случае просто ждешь от него реакции, тебе вообще не важно что он у себя делает внутри, закончил или нет, тебе нужна его реакция (output).
Ну есть еще всякие статус у процесса как у обьекта, и сколько жрет ЦПУ/памяти/диска например, если выебнутся этим с этим, но в реале на это забивают, и просто хавают output если он есть, a если него нет, то висят ожидая.
(а можно ведь и продиагностировать зависание и выдать юзеру в чем там дело)
Last edited by Xerox on Sun 17 Nov, 2019 00:59, edited 1 time in total.
User avatar
Xerox
Posts: 395
Joined: Sun 20 Oct, 2019 15:50
Has thanked: 354 times
Been thanked: 9 times

усовершенствовать дерево директорий

Post by Xerox »

Как определить, что ожидается дополнительный ввод?
Как узнать результат?
Как определить, что процесс закончил вывод?
А тебе все равно дополнительный это ввод или еще какой, - смотрим просто на статус StdIn и StdOut.
Если StdIn готов к записи, значит он чего-то от нас хочет или ждет, из StdOut мы должны были уже получить описание чего ему там надо (например "введите ваш логин:")
Все это мы прозрачно передаем сидящему юзеру "as is', даже не задумываясь о происходящем.
С выводом (результат) - еще проще, просто читаем по мере поступления из StdOut все что там есть и как есть, и пишем это на свою консоль (чтоб юзер видел)
Last edited by Xerox on Sun 17 Nov, 2019 01:10, edited 2 times in total.
User avatar
Xerox
Posts: 395
Joined: Sun 20 Oct, 2019 15:50
Has thanked: 354 times
Been thanked: 9 times

усовершенствовать дерево директорий

Post by Xerox »

Как впихнуть в stdout невпихуемое (вывод far.exe, например)?
Тут в общем, так,
1.) есть вывод CMD:

Code: Select all

string s1 = p1.StdOut.ReadAll(); // давай все что у тебя есть сейчас сказать
.. который мы хаваем, и, так или иначе, но чаще всего "как есть", переписываем в свою (ФАРовскую) консоль:

Code: Select all

Console.WriteLine(s1); // передаем полученное из CMD в вывод FAR
2.) И есть то, что мы хотим писать для себя/от себя, например заставку "Вася Пупкин аффтор этого всего" при загрузке.
"отсебятину" мы вольны писать как хочешь и в любом количестве, - просто

Code: Select all

Console.WriteLine("blah-blah-blah"); // это и есть "вывод ФАРа"
CMD это никак не мешает и не помогает, она про это не знает и знать не должна.
Единственно, что когда StdIn ждет чего-то, мы должны прекратить писать отсебятину и сделать добро юзеру:

Code: Select all

string s1 = Console.ReadLine();
.. и передать это в процесс:

Code: Select all

p1.StdIn.WriteLine(s1);
Last edited by Xerox on Sun 17 Nov, 2019 01:31, edited 10 times in total.
User avatar
Xerox
Posts: 395
Joined: Sun 20 Oct, 2019 15:50
Has thanked: 354 times
Been thanked: 9 times

усовершенствовать дерево директорий

Post by Xerox »

DrKnS, Я на все вопрпосы ответил? Если что - спрашивайте, думаю что смогу помочь, на словах по крайней мере :)
User avatar
buniak_a_h
Posts: 4262
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 644 times
Contact:

усовершенствовать дерево директорий

Post by buniak_a_h »

Xerox wrote: Sun 17 Nov, 2019 01:01
Как определить, что процесс закончил вывод?
С выводом (результат) - еще проще, просто читаем по мере поступления из StdOut все что там есть и как есть, и пишем это на свою консоль (чтоб юзер видел)
Я делал такой обмен с резидентным процессом. Всё хорошо, если процесс делает commit… Увы, на том языке, на котором был написан резидент (Харбор) мы не нашли команды commit для текстового файла (Харбор на самом деле - развитие Клиппера, а он - развитие макроязыка DBase-III). Приходилось тупо закрывать stdout и открывать снова.
На самом деле это хорошо, пока резидент не завис или не "умер". Т.е. запуск cmd с передачей ему командной строки и завершением намного устойчивее, чем резидентный вариант с обменом через stdin/stdout. Плата, по-моему - единственная: от вызова к вызову не сохраняются. установки environment-переменных (SET). Ну и в производительности проигрыш на несколько микросекунд.
User avatar
Xerox
Posts: 395
Joined: Sun 20 Oct, 2019 15:50
Has thanked: 354 times
Been thanked: 9 times

усовершенствовать дерево директорий

Post by Xerox »

buniak_a_h, создание нового процесса это довольно затратная операция и не микросекунды, на сильных компьютер это милисекунды, на слабых или загнанных - это и секдунды запросто.
плата тут еще такая, например, есть проблемы с aliases (doskey) - чтобы заработали как ожидается - целая эпопея.
Есть и еще, но некогда расписывать.
Это все решаемо, конечно, HO.
Многие профи сталкиваясь с подобными несуразностями решают что это (вникать в нежданчики на ровном месте) им не надо, отходят от ФАРа, а жаль.
И архитектурально то правильнее, что делает все костыли которые сделали и будут сделаны для того чтобы создать видимость работы в "настоящей консоли" становятся ненужными.
(я могу ошибаться преувеличивать количество костылей, но у меня было ощущение что много)
Сейчас ФАР, например, вынужден делать интерпретацию input-a, чтобы понять что юзер делает "set aaa=bbb" и сохранить эту переменную.
А вот если бы если снять ответственность с ФАРа за все происходящее, то не надо было бы, и было бы легче всем
(я так думаю, но это не точно)
(но архитектурально наверное правильнее).
"Снять ответственность" - это передавать и получать все "как есть", и работать будет ожидаемо и прозрачно.
Last edited by Xerox on Sun 17 Nov, 2019 02:17, edited 2 times in total.
User avatar
Xerox
Posts: 395
Joined: Sun 20 Oct, 2019 15:50
Has thanked: 354 times
Been thanked: 9 times

усовершенствовать дерево директорий

Post by Xerox »

buniak_a_h, то что клиппер ваш так чудил - странно, может вы все-таки что-то упустили..
Если прога написала что-то в оутпут буффер, то там это должно всяко быть, но в опчем не берусь судить строго.
А можешь ли послать этот самый клиппер и сценарий когда не доходят буковки?
User avatar
Xerox
Posts: 395
Joined: Sun 20 Oct, 2019 15:50
Has thanked: 354 times
Been thanked: 9 times

усовершенствовать дерево директорий

Post by Xerox »

с другой стороны, делать чисто хостинг CMD проблематично
Pеализуемо, но затратно.
Hадо будет поддерживать все возможности тонкости аутпута и инпута, а это плохо документировано 100%.
Например - консольная (ДОС) игра, там все тонкости будут задейстованы по полной.
С другой стороны, можно дейстивтельно чисто перенаправлять StdIn и StdOut на общую и единственную ФАРовскую консоль, этоо возможно, и по моему это сейчас так и работает, просто ComSpec завершается а не подолжает жить. Технически в одну и ту же консоль могут писать/читать обе проги. Ну в общем фиг знает. Попробовать конечно стоит, но заниматься возможностей нет ни у кого (я не ругаюсь, у самого возможности нет)
Post Reply

Return to “О тщете всего сущего”