|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
02.05.2024, 23:55 | #1 |
Разъяснятор
Форумчанин
Регистрация: 21.04.2022
Сообщений: 126
|
Вывод StdOut консоли в TMemo (сразу, не после закрытия консоли)
Всем доброго времени суток!
Да, я знаю, что тема перехвата вывода консоли не нова. И в интернете полно вариантов, как это можно сделать. Однако. Из того что я нашёл все варианты "ждут", пока консоль завершится и выводят результат уже после этого. Мне нужно запустить консольный архиватор 7z.exe - он в консоли отображает прогресс упаковки (сколько файлов упаковано и процент сжатия, если не ошибаюсь). Результатом консоли после закрытия будет что-то вроде "Упаковано K файлов. Объём архива L байт." А мне, в том-то и дело - нужно чтобы пользователь видел прогресс. И информацию с самого начала работы архиватора. Последний код, который я тестировал (с выводом после завершения процесса консоли) - вот: Код:
|
03.05.2024, 17:13 | #2 |
Участник клуба
Регистрация: 09.11.2007
Сообщений: 1,762
|
Может лучше использовать TSevenZipVCL ?
|
04.05.2024, 01:46 | #3 |
ПШП
Участник клуба
Регистрация: 15.07.2013
Сообщений: 1,897
|
Когда-то вот так делал вывод в Мемо, то что должна была выводить в консоль утилита gbak от Interbase/Firebird. Работает как надо.
Код:
|
11.05.2024, 00:55 | #4 |
Разъяснятор
Форумчанин
Регистрация: 21.04.2022
Сообщений: 126
|
2 northener, не работает - выводит в memo текст только после завершения консольного приложения. Как и опробованный мною до этого вариант. Проверяю элементарно - добавляю в папку заведомо большой файл (~700Мб) - программа виснет с курсором "песочные часы" и ничего не выводит в memo.
2 FaTaL, благодарю! На крайний случай взял на заметку. Однако не могу исключить такого варианта, что мне понадобится вывод какой-либо другой консольной софтины (с такой же трудоёмкостью - изменяет что-то в окне консоли). Последний раз редактировалось Arigato; 11.05.2024 в 22:43. |
11.05.2024, 02:06 | #5 |
ПШП
Участник клуба
Регистрация: 15.07.2013
Сообщений: 1,897
|
|
11.05.2024, 03:27 | #6 |
Разъяснятор
Форумчанин
Регистрация: 21.04.2022
Сообщений: 126
|
Попробовал поставить JEDI Code Library. С методом JCLSysUtils.Execute та же фигня - он срабатывает только при завершении консольного приложения.
|
11.05.2024, 16:41 | #7 |
Просветитель
Участник клуба
Регистрация: 26.12.2012
Сообщений: 1,844
|
С одним из обновлений в Windows 10 появился полноценный программный терминал (TTY), предназначенный как раз для подобных нужд. Реализуется функцией CreatePseudoConsole. Теория расписана на Хабре. Как следует из определения, работать будет только на Windows 10 версии 1809 и старше. Сам не пользовал.
|
11.05.2024, 20:52 | #8 | |
Разъяснятор
Форумчанин
Регистрация: 21.04.2022
Сообщений: 126
|
2 northener,
Код функции: Код:
Код:
2) А вот если в папку закинуть 700Мб файл - висит с изображением курсора в виде песочных часов Причина глюка: если ping, например, выводит последовательно строчки в консоль, то 7z.exe при упаковке больших объёмов меняет значение в одной строчке консоли. Т.е., как я понял буфер надо не прибавлять к тексту, а содержимым буфера заменять текст. А вот как это сделать правильно - я не понимаю. Просто заменить Код:
Код:
Если это имеет значение - код проверяю в Delphi 7 Цитата:
Есть ли вероятность того, что для реализации нужно патчить значения в памяти? Последний раз редактировалось Arigato; 11.05.2024 в 22:43. |
|
11.05.2024, 23:19 | #9 |
Разъяснятор
Форумчанин
Регистрация: 21.04.2022
Сообщений: 126
|
Отдалённо похожее на то, что надо, только пока не понял как сделать годное из этого
Если у кого-то есть желание потестить - это нужно делать именно с консольной программой 7z.exe - она работает по-особенному. |
12.05.2024, 01:55 | #10 | |
Просветитель
Участник клуба
Регистрация: 26.12.2012
Сообщений: 1,844
|
Цитата:
Для замены значения в строке консоли обычно выводят код #13 без #10. В теории этот момент можно было бы ловить, но, похоже, 7-Zip определяет, выводится ли прогресс в экранную консоль или в файл, и в файл ничего не выводит (предполагаю). То есть, перехват вывода равносилен отключению прогресса. В этом случае никак не поможешь, наверное. А что, если перейти на использование библиотеки? Раз предполагается наличие установленного 7-Zip по заданному пути или доступным через PATH, по нему будет лежать и 7z.dll, который всё реализует. Через PATH он сам найдется, иначе заданный путь можно в функцию передать, то есть класть DLL рядом с программой не придется. |
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Отмена при CTRL+С закрытия консоли | Tahoma | Общие вопросы C/C++ | 8 | 31.07.2017 17:47 |
После ошибки окно консоли закрывается и я не могу посмотреть, что за ошибка. | NAN_13 | Общие вопросы Delphi | 10 | 30.03.2017 01:29 |
Вывод из консоли в Memo | hotcooler17 | Win Api | 3 | 05.02.2010 20:51 |
Читает вывод из консоли | Consol | Win Api | 10 | 31.08.2009 08:42 |
Как захватить весь вывод в консоли??? | alexfmf | Общие вопросы Delphi | 5 | 13.05.2009 21:54 |