Total Commander Forum Index Total Commander
Форум поддержки пользователей Total Commander
Сайты: Все о Total Commander | Totalcmd.net | Ghisler.com | RU.TCKB
 
 RulesRules   SearchSearch   FAQFAQ   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Autorun
Goto page Previous  1, 2, 3 ... , 240, 241, 242  Next
 
Post new topic   Reply to topic    Total Commander Forum Index -> Плагины Total Commander printer-friendly view
View previous topic :: View next topic  
Author Message
Orion9



Joined: 01 Jan 2024
Posts: 1274

Post (Separately) Posted: Wed Sep 30, 2026 12:12    Post subject: Reply with quote

AkulaBig wrote:
куда правильно вставить это условие, чтобы все заработало.

Тут чекушку открывать надо, а сейчас за рулем, не могу.

Но если навскидку, то функция ET запускается 60 раз. Процесс exiftool должен запуститься один раз, и желательно за пределами этой функции. FieldIndex = 1 должен сделать запрос к запущенному процессу и ждать ответа. Остальные 59 вызовов будут просто разбирать полученный выхлоп на строки.

Это была тестовая функция для проверки скорости на группе выделенных файлов. В подсказке прирост скорости менее очевиден. Имхо, лучше оставить общение с процессом через файл, что я и сделал. И код намного проще, и скорость практически та же.

Вы можете сами протестировать и убедиться в этом. Тестовая функция с тремя режимами как раз и создавалась для этого:

Win+[ запуск exiftool для каждого файла.
Win+] держит процесс открытым и взаимодействует с ним через файл аргументов.
Win+\ взаимодействует с процессом через stdin и stdout.

Результат сохраняется во временный каталог, в файлы exif_[0,1,2]. Все три файла должны совпадать за исключением метки последнего времени доступа и маркера {ready}.

 Hidden text

Чем больше выделено файлов, тем больше (должен быть) прирост. Это было критично только для набора колонок в режиме просмотра х64. Но опция SetFieldsParam("Delayed", 1) вроде решает эту проблему. Вы ее пробовали?

Там только два прохода почему-то.
Back to top
View user's profile Send private message
AkulaBig



Joined: 03 Dec 2008
Posts: 626

Post (Separately) Posted: Wed Sep 30, 2026 13:39    Post subject: Reply with quote

Orion9 wrote:
Процесс exiftool должен запуститься один раз, и желательно за пределами этой функции.

За пределами он будет запускаться при старте ТС, что не очень хорошо. Но он запускается один раз, поэтому на данном этапе место запуска не имеет значения.
Orion9 wrote:
В подсказке прирост скорости менее очевиден.

Очень заметен.
Orion9 wrote:
лучше оставить общение с процессом через файл

Лучше, но проблема в том, при запуске колонок они засекаться начинают и все подвисает. А так у меня и вариант с файлами есть. но и там FieldIndex = 1 работает непонятно. Без него работает ощутимо медленней, а с ним когда начинаешь крякозябры убирать, почему-то по одному полю обрабатывается. То ли с FieldIndex = 1 надо алгоритм менять, то ли знать, куда его впихнуть. Но я многие варианты уже попробовал. Пока не получается.
Orion9 wrote:
SetFieldsParam("Delayed", 1)

Пока не пробовал. Не до нее. Сейчас надо сделать чтобы все работало правильно. А в дальнейшем похоже для подсказки придется запускать отдельный экземпляр ET и временные файлы с другим названием.
Back to top
View user's profile Send private message
FallenAngel



Joined: 30 Dec 2025
Posts: 45

Post (Separately) Posted: Wed Sep 30, 2026 17:09    Post subject: Reply with quote

В последнее время часто вылетает на Win11 25H2

Code:
Имя сбойного приложения: TOTALCMD64.EXE, версия: 11.58.0.0, метка времени: 0x00000000
Имя сбойного модуля: Autorun.wdx64, версия: 2.2.21.3, метка времени: 0x68ef4c72
Код исключения: 0xc0000005
Смещение ошибки: 0x000000000005fa02
Идентификатор сбойного процесса: 0x229C
Время запуска сбойного приложения: 0x1DD50D5A31BB41E
Путь сбойного приложения: D:\soft\Total Commander 64\TOTALCMD64.EXE
Путь сбойного модуля: D:\soft\Total Commander 64\Plugins\Autorun\Autorun.wdx64
Идентификатор отчета: 0c64ebd0-8054-4fdf-8c0b-3116aec21693
Полное имя сбойного пакета:
Код приложения, связанного со сбойным пакетом:
Back to top
View user's profile Send private message
AkulaBig



Joined: 03 Dec 2008
Posts: 626

Post (Separately) Posted: Wed Sep 30, 2026 18:03    Post subject: Reply with quote

Orion9
Вот вариант с временными файлами. Ваш вариант летает как ракета, если FieldIndex = 1. Но кривой вывод:

А если оставить -G -S, то только на английском и с наименованием группы.
А вот мой вариант с корректным выводом полей, но без FieldIndex:
 Hidden text


Он работает медленно. А если прописать FieldIndex, то получается фигня:

Но с MI этот-же алгоритм работает без проблем. Очень хочется добиться быстрой и правильной работы.
Back to top
View user's profile Send private message
Orion9



Joined: 01 Jan 2024
Posts: 1274

Post (Separately) Posted: Thu Oct 01, 2026 13:39    Post subject: Reply with quote

FallenAngel wrote:
Имя сбойного приложения: TOTALCMD64.EXE, версия: 11.58.0.0, метка времени: 0x00000000
Имя сбойного модуля: Autorun.wdx64, версия: 2.2.21.3, метка времени: 0x68ef4c72
Код исключения: 0xc0000005

К сожалению, это мало о чем говорит. Ошибка произошла в модуле Autorun, но что именно случилось, не понятно.

AkulaBig wrote:
Он работает медленно.

Не мудрено. У вас сейчас в этой функции 60 раз читается ini, 60 раз проверяется id процесса и 60 раз удаляется файл. И это для каждой подсказки.

AkulaBig wrote:
А если прописать FieldIndex, то получается фигня

FieldIndex = 1 как раз нужен, чтобы сделать иницилизацию только один раз, когда вызывается первое поле подсказки, у меня так и сделано
Code:
Func ExifHint(FileName, FieldIndex, UnitIndex)
    If FieldIndex > gHintLines Then Return
    If StrPos(FileGetAttr(FileName), "D") Then Return

    Local bCtrl = BitAND(DllCall("GetKeyState", "int", 0x14, "short"), 1)   
    If Not bCtrl then bCtrl = IsPressed (0x11)
    If gHintCaps And Not bCtrl Then Return
         
    If FieldIndex = 1 Then
       #ProcessExecGetOutput /C:65001 gHintPipe %gMediaExifX32% ' -G -S -lang ru "%FileName%"'     
       gHintPipe = GetExifInfo(FileName)
    Endif     
    #Return FixSpaces(StrPart(gHintPipe, auLF, FieldIndex))
    Return StrPart(gHintPipe, auLF, FieldIndex)   
EndFunc

Даже этот код можно попробовать оптимизировать, убрав все лишнее: т.е. убрать все, что выше If FieldIndex = 1, в само условие If FieldIndex = 1.

Объект BinaryFile должен быть в статике, чтобы он тоже не создавался 60 раз
Code:
Static obj = BinaryFile(gExifArgs, "a")

Free(obj) тогда не нужен.

AkulaBig wrote:
Ваш вариант летает как ракета

Работает он быстро, но не стабильно. Скорее всего файл не успевает удаляться, поэтому не всегда результат в подсказке корректен. Нужно делать дополнительню проверку удаления файла, чтобы гарантировать надежность, но, понятное дело, ценой потери в скорости. Как сказал болван
Quote:
Если один и тот же файл постоянно перезаписывается, никогда не доверяйте успешному возврату из DeleteFileW. Либо переименовывайте файл в случайное имя перед удалением (чтобы сразу освободить оригинальное имя), либо используйте цикл с GetFileAttributesW, чтобы дождаться реального исчезновения файла с диска.

И соответствующий код
 Hidden text

AkulaBig wrote:
Но кривой вывод

Вывод не кривой, а сырой (неформатированный). Я так и не понял, что хочу от этой подсказки, поэтому она осталась в недоделанном состоянии.
Back to top
View user's profile Send private message
AkulaBig



Joined: 03 Dec 2008
Posts: 626

Post (Separately) Posted: Thu Oct 01, 2026 14:19    Post subject: Reply with quote

Orion9 wrote:
У вас сейчас в этой функции 60 раз читается ini, 60 раз проверяется id процесса и 60 раз удаляется файл. И это для каждой подсказки.

Это я уже понял.
Orion9 wrote:
Я так и не понял, что хочу от этой подсказки, поэтому она осталась в недоделанном состоянии.

В этом как-раз вся суть моего вопроса. Я-же на скрине показал ваш неформатированный вывод и какой должен быть форматированный вывод на моем скрине. М вот здесь появляется большое "но". Для такого форматированного вывода требуется прописать a = StrPart(String, ": ", 1), b = StrPart(String, ": ", 2). То-есть обработать наименование полей и поля отдельно. Тогда и от пробелов можно избавиться и от крякозябров. Но этот код работает только если нет условия If FieldIndex = 1. Стоит нам его использовать и StrPart(String, ": ", 1) выводит только наименование ОДНОГО поля! Я это тоже на скрине показал. Можно ли придумать решение этой проблемы?
То-есть неформатированный вывод, как на вашем скрине с If FieldIndex = 1 работает. Форматированный вывод, как на моем скрине с If FieldIndex = 1 не работает.
Но для MI подобный алгоритм у меня работает. Не понимаю, почему? Кажется совершенно одинаковый код самого вывода.

Добавлено спустя 35 минут:

На всякий случай решил ваш код выложить с неформатированным выводом. Может вам легче с ним будет работать. Просто он тоже обработан мной. Так как этот код у вас входит в пример для переключения между типом подсказок.
 Hidden text

Я закомментил несколько ваших строк, чтобы русский язык появился. При -S названия полей могут быть только на английском. А при -G обязательно будут выводиться группы. Что, конечно, не нужно. Если эти ключи убрать и попытаться использовать StrPart(String, ": ", 1) у вас получится как у меня, вывод только одного поля.
Back to top
View user's profile Send private message
AkulaBig



Joined: 03 Dec 2008
Posts: 626

Post (Separately) Posted: Thu Oct 01, 2026 22:15    Post subject: Reply with quote

Orion9
Уф, решил проблему. Всего-то переменную ansi, в которую получаем результат, надо было объявить Static, а не Local.
Back to top
View user's profile Send private message
Orion9



Joined: 01 Jan 2024
Posts: 1274

Post (Separately) Posted: Fri Oct 02, 2026 14:10    Post subject: Reply with quote

AkulaBig
Если использовать функции для работы с exiftool через stdin/stdout, можно сделать так.
Code:
If Not StartExifProcess() Then Return ShowHint("Операция прервана")

Функция для обработки полей.

 Hidden text

 Hidden text

Выхлопывает так, что треск стоит.
Back to top
View user's profile Send private message
AkulaBig



Joined: 03 Dec 2008
Posts: 626

Post (Separately) Posted: Fri Oct 02, 2026 15:12    Post subject: Reply with quote

Orion9
Я все сделал полностью. Подсказки сделал через потоки и они стали отлично работать одновременно с показом колонок. Которые у меня через файлы. По скорости примерно как у вас. С учетом, что у меня время на форматирование тратится. Сейчас надо придумать, как сделать, чтобы ET не висел постоянно в памяти после отображения колонок. Сейчас у меня процесс отслеживается и прибивается, если нет колонок на экране. Но конечно он и подсказку отрубает.
Помнится мы обсуждали тему количества пользовательских полей в Авторане. Все-же они ограничены 60 или можно больше? Вроде в колонках и 120 отображается. Но кажется они не работают. Напомните, пожалуйста, как с этим дело обстоит? Хотелось бы и MI сохранить. Кажется для медиа-файлов он получше. Хотя надо прямо скрины делать. Попытался вручную сравнить. Запутался. Еще и delay не проверял. В общем причесывать буду. Главное наконец-то все работает.
Back to top
View user's profile Send private message
AkulaBig



Joined: 03 Dec 2008
Posts: 626

Post (Separately) Posted: Sat Oct 03, 2026 07:33    Post subject: Reply with quote

Внимательно потестил выводимые MI и ET данные. Победителя нет. Разные расширения лучше обрабатывает то одна, то другая прога. Решил просто сделать выбор MI или ET для подсказок.
Периодически вылетает такая ошибка:

На AU3 у меня тоже такое было. Там вроде решил эту проблему, хоть попотеть пришлось. А здесь можно что-то сделать. Ошибка однозначно как-то связана с условием If FieldIndex = 1. Раньше таких ошибок не было.
Back to top
View user's profile Send private message
Orion9



Joined: 01 Jan 2024
Posts: 1274

Post (Separately) Posted: Sat Oct 03, 2026 11:39    Post subject: Reply with quote

AkulaBig
Вариант с файлами нормальный, но он не гарантирует полную надежность, к сожалению.

Дело не только в файле exiftool_out.txt, который не успевает удаляться, но чаще сама exiftool не успевает закрыть файл, поэтому FileRead возвращает пусто.

В справке Autorun есть пример создания временного файла, можно им воспользоваться, чтобы решить проблему с удалением.
Code:
Func GetTempFileName()
    Local tmpfile
    Do
      tmpfile = TEMP & "\temp" & Hex(Random(1, 0xFFFFFF, 1), 6) & ".tmp"
    Until Not FileExist(tmpfile)
    Return tmpfile
EndFunc

И поставить первую задержку перед FileRead, а не после, чтобы уменьшить шанс пустого выхлопа. Полный фрагмент будет выглядеть так
Code:
sExifOut  = GetTempFileName()       
Local sArgs = "-G0"   & auCRLF & _             
              "-lang" & auCRLF & _
              "ru"    & auCRLF & _                     
              "-W+!"  & auCRLF & gExifOut & auCRLF & FileName & auCRLF & "-execute" & auCRLF       
Static obj = BinaryFile(gExifArgs, "a")   
obj.WriteStr(sArgs, "", "UTF-8")
ansi = "<time-out>"
For i = 1 To 10
    Sleep(50)
    If FileExist(gExifOut) Then
       ansi = FileRead(gExifOut, 0, "UTF-8")
       DllCall("kernel32.dll\DeleteFileW", "Wstr", gExifOut)
       Break
    EndIf
Next
Return ansi

Это существенно увеличивает надежность, но вряд ли гарантирует ее полностью.

Чем больше задержки, тем выше надежность, но скорость при этом, конечно, теряется, хотя незначительно, на подказке это не сильно отразится.

У вас файлы для тестов есть? Можете на дропбокс скинуть? Я чуть позже отпишусь.
Back to top
View user's profile Send private message
AkulaBig



Joined: 03 Dec 2008
Posts: 626

Post (Separately) Posted: Sat Oct 03, 2026 12:28    Post subject: Reply with quote

Orion9 wrote:
не успевает удаляться, но чаще сама exiftool не успевает закрыть файл, поэтому FileRead возвращает пусто.

У меня через цикл While сделано. Так что вроде все успевает отработать. Задержка действительно задерживает вывод, поэтому не стоит ее такой большой делать. Ошибка, которая периодически появляется вообще никак с файлами не связано. Ведь подсказка у меня сделана на потоках. Она как-то связана с номером поля.
Файлы попозже выложу. Я сейчас причесываю код и подсказки не показывает. Надо будет выбрать, где максимальная задержка.
Back to top
View user's profile Send private message
Orion9



Joined: 01 Jan 2024
Posts: 1274

Post (Separately) Posted: Sat Oct 03, 2026 14:26    Post subject: Reply with quote

AkulaBig
Ну в общем понятно, почему я не сдал делать через stdin/stdout. Геморроя больше.

Когда взаимодействие идет через файлы, Autorun вообще ничего не знает о процессе exiftool: его задача - записать в один файл и ждать ответа в другом.

Но когда взаимодействие идет с самом процессом, приходится ждать пока он не отдаст все данные до конца, и так становится сложнее организовать таймаут. Пока я сделал так, но это приводит к другим проблемам

 Hidden text
Back to top
View user's profile Send private message
AkulaBig



Joined: 03 Dec 2008
Posts: 626

Post (Separately) Posted: Sat Oct 03, 2026 21:53    Post subject: Reply with quote

Orion9 wrote:
почему я не сдал делать через stdin/stdout. Геморроя больше.

Дак другого выхода нет. Вы попробуйте решить вопрос комплексно и увидите, что пользовательские колонки и подсказка одновременно не будут работать через временные файлы. Поэтому у меня сейчас колонки сделаны через файлы, а подсказка через поток. Все отлично работает.
Orion9 wrote:
так становится сложнее организовать таймаут

А если делать разными методами, то никакого таймаута не надо. А полное чтение данных обеспечивает цикл While. А попытки сделать заданное количество шагов приводят к непрочтению данных. Вы-же не знаете, сколько времени надо, чтобы прочитать какой либо файл. Чтобы прочитать все данные из моего тяжелого файла, мне пришлось и WinScriptsAdv переделать. В нем тоже этот момент не был учтен.
Я сборку доделал, так что можете посмотреть, как все отлично работает одновременно. Подсказка переключается на ПИ настроек. Можно стандартные, MI, ET. Сейчас хочу добавить чтобы можно было переключать временно источник подсказки через Ctrl. Ну и главный вопрос, что делать с запущенным экземпляром ET. Он запускается только после просмотра колонок, но после этого висит в памяти. А вот ET от подсказки не висит в памяти. Жаль, что в AU3 так не сделать. Вернее я могу конечно завершать ET на каждом файле, но это раза в 3 увеличивает время вывода инфы в колонках.

Добавлено спустя 25 минут:

Вот архивчик тяжелых файлов: https://www.dropbox.com/scl/fi/bqzcyojbnpzvekq22chk8/test.7z?rlkey=fsidshcfuvdje2jnljsgway2n&st=lpr515a1&dl=1
Back to top
View user's profile Send private message
Orion9



Joined: 01 Jan 2024
Posts: 1274

Post (Separately) Posted: Sun Oct 04, 2026 14:12    Post subject: Reply with quote

AkulaBig
Извиняюсь за задержку. Сейчас времени совсем мало, отрываться как раньше уже не получается и вряд ли скоро получится.

AkulaBig wrote:
Все-же они ограничены 60 или можно больше

Можно больше, но я не помню точное число. В общем, ничто не мешает создать еще 30-40 полей типа C61-C100, но они могут вылезать за экран.

Можно, при желании, сделать дополнительный алгоритм, который будет проверять текущие настройки экрана и в зависимости от них выделять нужное количество строк.

AkulaBig wrote:
Периодически вылетает такая ошибка:

Скорее всего индекс в массиве вышел за границы допустимого или, как вы верно заметили, номер поля оказался выше или ниже доступного. Например, если обратиться к полу C62, которого не существует, будет такая ошибка.

AkulaBig wrote:
А если делать разными методами, то никакого таймаута не надо

Таймаут это бонус, чтобы не ждать отклика от exiftool несколько секунд с повисшим интерфейсом ТС, но задачу надежности сам по себе он решает. Для полной надежности нужно проверять результат FileRead(gExifOut, 0, "UTF-8"), ждать пока ошибок чтения не будет. Или можно увеличить слип перед этим и забить на тот факт, что exiftool может в этот слип не уложиться.

AkulaBig wrote:
Ну и главный вопрос, что делать с запущенным экземпляром ET.

Такие вопросы нужно у болвана Супер Интеллекта Трампа спрашивать, он их как семечки щелкает.

У вас же отдельный поток все время крутится, можно из него переодически проверять зависшие процессы exiftool.exe и прибивать.
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    Total Commander Forum Index -> Плагины Total Commander All times are GMT + 4 Hours
Goto page Previous  1, 2, 3 ... , 240, 241, 242  Next
Page 241 of 242

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group