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 ... 239, 240, 241
 
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: 1269

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: 620

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: 620

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: 1269

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: 620

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: 620

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
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 ... 239, 240, 241
Page 241 of 241

 
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