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
 
Post new topic   Reply to topic    Total Commander Forum Index -> Плагины Total Commander printer-friendly view
View previous topic :: View next topic  
Author Message
AkulaBig



Joined: 03 Dec 2008
Posts: 630

Post (Separately) Posted: Sun Oct 04, 2026 15:38    Post subject: Reply with quote

Orion9 wrote:
У вас же отдельный поток все время крутится, можно из него переодически проверять зависшие процессы exiftool.exe и прибивать.

У меня сейчас примерно так и сделано. Проверяется открыты колонки пользователя и если нет, то процесс прибивается. Но при этом прибиваются и подсказки. Так что тут что-то серьезное надо. Интересно, умеет ли Авторан запускать именованный экземпляр?
Back to top
View user's profile Send private message
Orion9



Joined: 01 Jan 2024
Posts: 1277

Post (Separately) Posted: Sun Oct 04, 2026 20:31    Post subject: Reply with quote

Для начала. Если подсказка вызывается на тяжелом файле, ТС вешается, и приходится только ждать. Это обычное поведение тотала:

 Hidden text


Проблема с stdin/stdout, о которой я писал выше, выглядит следующим образом.

Когда ExifTool выполняет команду -execute, результат выполнения передается в stdout с маркером {ready}. PeekNamedPipe, добавленная в последнем коде, позволяет заглянуть в устройство вывода и проверить есть ли в нем данные. Если данных нет, то можно еще немного подождать и выйти по таймауту. Однако это не остановит саму ExifTool и не прервет операцию вывода. При наведении на следующий файл в подсказке будут отображаться даннные таймаута, а не текущего файла.

Чтобы синхронизировать процесс ввода-вывода, к команде -execute можно добавить любое число: тогда ExifTool пометит вывод для этой команды соответствующим маркером {ready+число}. Например: -execute320 --> {ready320}. Теперь можно пропарсить этот вывод, выкинув из него всё ненужное. Такой вариант я и попробовал, однако он не решает всех проблем. Подсказка легко скользит по панели и не вешает ТС даже на медленных файлах, но ExifTool продолжает делать вывод в stdout, и нет возможности его прервать: разработчик не предусмотрел такой опции.

Болван wrote:
ExifTool не имеет встроенного текстового или программного механизма, чтобы сказать ему: «Отмени текущую команду -execute, но сам не умирай».

В официальной документации Image::ExifTool и в описании параметров -stay_open логика стейт-машины прописана однозначно. Когда вы отправляете маркер -execute, ExifTool заходит во внутренний синхронный цикл (написанный на Perl). Пока этот цикл парсит битый или тяжелый файл, процесс физически не читает stdin. Вы можете слать туда любые команды отмены — они просто будут копиться в буфере операционной системы. ExifTool увидит их только тогда, когда закончит текущую операцию (то есть когда отменять будет уже нечего)

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

 Hidden text


Пришлось придумать что-то другое. Получилось где-то так:

 Hidden text


Прикольно, конечно, но все-равно приходится ждать. Но это лучше, чем повисший интерфейс. Если бы была возможность остановить ненужный вывод, было бы еще лучше.

Переменные, которые управляют режимами
Code:
Local gExifBusyHint = 1, gExifTimeOutHint = 1

Если оставить нули
Code:
Local gExifBusyHint = 0, gExifTimeOutHint = 0

То подсказка будет стандартная тоталовская, но за счет Sleep(10) дает возможность откликаться интерфейсу при зависании

 Hidden text


Переменная gExifFixAnsi включает преобразование кракозябр после первой ":", gExifConverseAnsi включает преобразование utf8 символов в ansi после первой ":"

Обновленные функции (остальные были выше)

 Hidden text

 Hidden text


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

AkulaBig wrote:
Интересно, умеет ли Авторан запускать именованный экземпляр?

Можно спросить у болвана, умеет ли это делать AutoHotKey v2. Если да, то и Autorun тоже с большой долей вероятности.
Back to top
View user's profile Send private message
AkulaBig



Joined: 03 Dec 2008
Posts: 630

Post (Separately) Posted: Sun Oct 04, 2026 22:20    Post subject: Reply with quote

Orion9 wrote:
Прикольно

Действительно прикольно с мигающим окном предупреждения. Хотя и второй вариант неплох. Попробую повторить. Мне кажется у меня побыстрей данные вытягивает из mwt-2021-proceedings.pdf.
Orion9 wrote:
умеет ли это делать AutoHotKey v2. Если да, то и Autorun тоже с большой долей вероятности.

Я не пойму, Авторан на AHK написан? Или функционал с него скопирован?

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

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



Joined: 01 Jan 2024
Posts: 1277

Post (Separately) Posted: Mon Oct 05, 2026 14:08    Post subject: Reply with quote

AkulaBig wrote:
Я не пойму, Авторан на AHK написан? Или функционал с него скопирован?

Последние версии Autorun многое переняли из Autohotkey, хотя сам Loopback никогда не говорил, что ориентируется именно на AHK, но синтаксис очень похож. Особенно последние добавленные функции, вроде DllCall, которые выглядят очень похоже.

Именно об этом и речь. Если есть возможность решить задачу на Autohotkey при использовании DllCall и прочего, то скорее всего получится сделать то же самое и на Autorun.

Есть, конечно, исключения, например объект СОМ, которого в Autorun попросту нет, или какие-нибудь двумерные массивы или прочие ограничения, но в целом, много можно повторить и сделать.

А к болвану так и так идти надо. Вы думаете, я открыл доки по пайпам и стал что-то там конструировать? Да нет, конечно. Весь код болванный Laughing Даже последняя доработка с PeekNamedPipe тоже была от болвана Laughing

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

А что касается подсказки, там есть, где полю развернуться. Можно сделать ini-файл для хранения опций и параметров exiftool, можно менять их на лету для каждой секции панели или в зависимости от расширения и т.д.

С временными файлами должно точно так же работать. Если есть таймаут, exiftool не остановится и продолжит выполнение, пока не запишет все во временный файл, а сам файл скорее всего уже не удалится и останется во временном каталоге.
Back to top
View user's profile Send private message
AkulaBig



Joined: 03 Dec 2008
Posts: 630

Post (Separately) Posted: Mon Oct 05, 2026 16:13    Post subject: Reply with quote

Orion9 wrote:
Если есть таймаут, exiftool не остановится и продолжит выполнение

В общем с тайм-аутом не получилось. Вешает даже без совместной работы с колонками. Например, наводим на mwt-2021-proceedings.pdf. Подсказка начинает мигать. Не ждем, а начинаем двигать мышь дальше. Все вешается Sad
Еще интересный глюк появился. Почему-то крякозябры перестали преобразовываться по очень интересной схеме. С половины данных. То-есть пол строки преобразовалось, а половина нет.
Важный вопрос. Про глюк с индексами. У меня поля так прописаны: "C60:::FileHint" "CD61:::CD". То-есть есть поле, не относящееся к подсказке. Удалил "CD61:::CD" и пока не удалось ни одного глюка словить. То-есть надо ограничивать количество обработанных колонок только нужными? Если да, то как это сделать?
Back to top
View user's profile Send private message
AkulaBig



Joined: 03 Dec 2008
Posts: 630

Post (Separately) Posted: Mon Oct 05, 2026 20:14    Post subject: Reply with quote

Проверил сам. Количество обрабатываемых полей соответствует их определению. Значит не из-за этого ошибка вываливается. А может глючить из-за того, что полей 61? Поле работает отлично в другом модуле. По идее значит не может быть из-за этого глюк.
Back to top
View user's profile Send private message
yozhik



Joined: 04 May 2014
Posts: 353
Location: Электросталь

Post (Separately) Posted: Tue Oct 06, 2026 00:23    Post subject: Reply with quote

БАГ
Для Loopback, когда он back.
Buffer.SetNum с типом ptr на x64 обрезает значение до 32 бит. 64-битная SetNum("ptr") теряет старшие 32 бита. Тест:

Code:
If AUTORUN_TCARCH = 64 Then
    Local tst = Buffer(8)
    tst.Zero()
    tst.SetNum(0, "ptr", 0xABCD12345678)
    Local nHi = tst.GetNum(4, "dword")
    MsgBox("SetNum(ptr) high dword=" & nHi & _
           "  (43981=OK, 0=обрезает до 32 бит)", "test")
    Free(tst)
EndIf

_________________
Amo ergo sum
Back to top
View user's profile Send private message
Orion9



Joined: 01 Jan 2024
Posts: 1277

Post (Separately) Posted: Tue Oct 06, 2026 14:07    Post subject: Reply with quote

yozhik
Да, похоже, теряет. Тип "handle" тоже не работает. Тип hwnd не проверял, а вот int_ptr и uint_ptr работают. Тип "int64" тоже вроде рабочий.

AkulaBig wrote:
Почему-то крякозябры перестали преобразовываться по очень интересной схеме. С половины данных. То-есть пол строки преобразовалось, а половина нет.

Может быть. Преобразовывается то, что после двойных точек. Но если двойных точек две-три, или кроме символов 0xFFFB есть что-то еще, то образуются новые кракозябры.

Решение от болвана - переводить посимвольно, но нужно ли?

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



Joined: 03 Dec 2008
Posts: 630

Post (Separately) Posted: Tue Oct 06, 2026 20:11    Post subject: Reply with quote

Orion9 wrote:
Преобразовывается то, что после двойных точек.

Да не, все нормально у меня. Кстати, для ET надо и название и значение преобразовывать. Я про употребление тайм-аута. С ним почему-то название или значение может наполовину крякозябрами показывать. Возможно цикл преобразования не успевает отработать.
Back to top
View user's profile Send private message
Orion9



Joined: 01 Jan 2024
Posts: 1277

Post (Separately) Posted: Tue Oct 06, 2026 20:49    Post subject: Reply with quote

AkulaBig
Ситуация с индексами, как я понял, примерно такая.

Когда поля создаются через Pragma AutorunPluginFields первому полю присваивается первый индекс и т.д. по порядку. Если объявить 60 полей С1-С60, то индекс=52 должен вернуть значение С52 и т.д. Но если объявить что-то перед С1-С60, то индекс сместится, т.е. индекс=52 уже не вернет значение поля С52, а вернет индекс другого, соседнего поля. Поэтому, создавая группу полей, где важно сохранить индекс в первоначальном виде, чтобы потом не мучиться со смещением, нужно объявлять их сразу за Pragma AutorunPluginFields, и можно спокойно увеличить их количество: C1-C90.

Если вы хотите еще добавить полей, то лучше добавлять их по 30, т.к. это ограничение тотала на один тип. Но можно еще 10 добавить, тогда в секции HintsCustomField будет уже 4 ключа на *.*, а не три.

На счет кракозябр. Изначально было сделано самым простым способом, когда из буфера, содержащего байты, вытягивается одна строка в кодировке Utf8, а другая в Ansi. Далее строка Utf8 обрабатывается построчно. Если в ней есть символ FFFB, то берется эквивалент из Ansi. Расчет на то, что конец строки (за символом ":") весь в Ansi, но если это условие не соблюдается, то будут другие кракозябры из-за избыточной конвертации.

Болван предложил решение, конечно, крутое, но у меня возникла другая идея, попроще. Функция делает практически то же самое, и если бы не суррогатные пары, была бы совсем простой

 Hidden text


Вместо
 Hidden text

теперь вот так, но зато посимвольно
 Hidden text
Back to top
View user's profile Send private message
AkulaBig



Joined: 03 Dec 2008
Posts: 630

Post (Separately) Posted: Tue Oct 06, 2026 22:07    Post subject: Reply with quote

Orion9 wrote:
Ситуация с индексами

Похоже больше 60 колонок не поддерживается Sad В Ауторан при выборе полей в колонках показывает хоть сколько. Но при выводе подсказки 61 полем, которое я отдал под uCD, периодически глючит Sad Хотя я обрабатываю только 60 полей в подсказке ET, MI. В общем сейчас я перешел на 59 полей в подсказке и плюс под uCD, то-есть всего 60 полей. Посмотрим, будет ли глючить.
Orion9 wrote:
зато посимвольно

Посмотрю, конечно. У мене не совсем как у вас сделано. Кодировки немного другие при получении данных. Поэтому надо разбираться. Только не пойму, сейчас ведь тоже посимвольно:
Code:
Func FixCPET(String)
   Static a = List(), u = List()
   Local ansi = String, utf8, wrong = Chr(0xFFFD)
   Local nSize = StrLen(ansi)
   Local buf = Buffer(nSize)
   buf.Zero()
   buf.SetStr(ansi, 0, nSize, "ANSI")
   utf8 = buf.GetStr(0, nSize, "CP:65001")
   Free(buf)
   a.Count = 0
   u.Count = 0
   a.Text = ansi
   u.Text = utf8
   For i = 0 to u.Count - 1
      If StrPos(u[i], wrong) Then u[i] = a[i]
   Next
   Return u.text
EndFunc

Или я не прав?
Orion9 wrote:
Расчет на то, что конец строки (за символом ":") весь в Ansi

Нет, нет. У ET надо и название и значение конвертить. Так как крякозябры и там и там могут быть. Вот так у меня для ET:
Code:
Func TrimSpacesET(String)
   Local NameField, ValField
   If Not StrPos(String, ":") Then Return String

   NameField = StrPart(String, ": ", 1)
   ValField = StrPart(String, ": ", 2)

   Return StrTrim(FixCPET(NameField)) & ": " & StrTrim(FixCPET(ValField))
EndFunc
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
Page 242 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