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 ... 123, 124, 125 ... 133, 134, 135  Next
 
Post new topic   Reply to topic    Total Commander Forum Index -> Плагины Total Commander printer-friendly view
View previous topic :: View next topic  
Author Message
Skif_off



Joined: 28 Nov 2012
Posts: 1232

Post (Separately) Posted: Sat Jul 01, 2023 19:51    Post subject: Reply with quote

Loopback
Вполне допускаю, что понял неверно Smile, сейчас ещё раз перечитал с поста от 24го и теперь задача как будто выглядит так: проверять, что в памяти не осталось копий процессов TC, полное имя испоняемого файла которых то же, что и у родительского процесса скрипта.
Если так, то логичнее реализовать в скрипте, вместо автозавершения скрипта в AutorunFinalizeSection.

P.S. Интересно звучит задачка.
Back to top
View user's profile Send private message
LonerD



Joined: 04 Jan 2011
Posts: 1168
Location: Донецк

Post (Separately) Posted: Sat Jul 01, 2023 23:41    Post subject: Reply with quote

Другими словами немного подробней.
Есть мой Тотал, настроенный. В Autorun прописан запуск программы, она запускается и работает в фоне. Я могу запускать несколько копий моего Тотала и закрывать их. Всё это время программа должна быть запущена. Когда я закрою последнюю копию моего Тотала - программа должна выгрузиться.
В то же время параллельно я могу запускать чистый Тотал или чужие сборки. Они никак не должны влиять на запуск и закрытие программы.

PS. В моём случае нужная "программа" - это скомпилированный скрипт. Задача на таком уровне решаемая - запоминать или записывать в отдельный файл все PID запускаемого процесса ТС и время от времени опрашивать их. Если все PID выгружены - то выгружается и программа-скрипт.
Но пока не стал усложнять и сделал просто - программа работает до тех пор, пока запущено хоть одно окно любого ТС. Laughing

_________________
Win11 x64 Eng | TC DreamLair eternal pre-α
Back to top
View user's profile Send private message
Skif_off



Joined: 28 Nov 2012
Posts: 1232

Post (Separately) Posted: Mon Jul 03, 2023 20:52    Post subject: Reply with quote

LonerD wrote:
... мой Тотал ... несколько копий моего Тотала ...

Т.е. "мой" лежит в конкретной папке, любой не-"мой" - в любом другом каталоге?
LonerD wrote:
запоминать или записывать в отдельный файл все PID запускаемого процесса ТС и время от времени опрашивать их. Если все PID выгружены - то выгружается и программа-скрипт.

Как-то всё вместе не очень понятно звучит Smile, скрипт сам запускает все другие копии ТС или он для другого? Если второе, то получать и хранить список PID как-то расточительно, на AutoIt добавил бы в скрипт что-то типа такого:
Code:
#NoTrayIcon

#include "WinAPIEx.au3"

; Регистрируем функцию проверки процессов
AdlibRegister("CheckProc", 3000)

Local $sTCExe = _WinAPI_GetProcessFileName($CmdLine[1])
Local $sTCPath = StringRegExpReplace($sTCExe, "\\[^\\]+$", "\\")
Local $iTCNameLen = StringLen($sTCPath)

; Тут собственно скрипт

Func CheckProc()
    AdlibUnRegister("CheckProc")
    Local $sTmp
    Local $iCount = 0
    Local $aProcList = ProcessList()
    For $i = 1 To $aProcList[0][0]
        If StringMid($aProcList[$i][1], 1, 8) = "TOTALCMD" Then
            $sTmp = _WinAPI_GetProcessFileName($aProcList[$i][0])
            If StringMid($sTmp, 1, $iTCNameLen) = $sTCPath Then
                $iCount += 1
                ExitLoop
            EndIf
        EndIf
    Next
    If $iCount = 0 Then Exit
EndFunc

$CmdLine[1] - PID родительского ТС, получаем от Autorun и используем для получения каталога TC из полного имени исполняемого файла, раз в 3 секунды перебираем PID'ы, смотрим, где лежат исполняемые файлы и сравниваем.
Если скрипт что-то пишет, то Exit, наверное, стоит заменить на переменную и обрабатывать ее в основном теле скрипта.
ProcessList() можно запускать с параметром и она сама отфильтрует по имени процесса, выйдет покороче, но процессов может быть два, "TOTALCMD.EXE" и "TOTALCMD64.EXE", поэтому только перебор всех.
Есть ещё вариант получить список всех окон, отфильтрованный по "TTOTAL_CMD", но некоторые инструменты можно запускать отдельным процессом...
Back to top
View user's profile Send private message
LonerD



Joined: 04 Jan 2011
Posts: 1168
Location: Донецк

Post (Separately) Posted: Fri Jul 14, 2023 02:15    Post subject: Reply with quote

Время от времени стали возникать непонятные проблемы (может они и раньше возникали, просто Тоталом менее активно пользовался).

В autorun.cfg прописаны переменные окружения. Например,
SetEnv /A /EV PATH ;%commander_path%\System
SetEnv /EV TCFS %commander_path%\Plugins\exe\TCFS2\TCFS2.exe
и прочие.

Иногда Тотал теряет их. И при попытке выполнить команду, содержащую такую переменную, выдаёт ошибку, что "такого файла не существует".
Нечасто, может раз-два в неделю. Не могу понять причину и закономерности, почему так происходит. После перезапуска Тотала всё снова работает.
Может кто сталкивается?
Или плагин Autorun выгружается? (по какой причине это может происходить? командой выгрузки плагинов не пользуюсь). Или работа назначенных при запуске переменных не зависит от него?
_________________
Win11 x64 Eng | TC DreamLair eternal pre-α
Back to top
View user's profile Send private message
Loopback



Joined: 07 Sep 2009
Posts: 1291

Post (Separately) Posted: Sun Jul 16, 2023 23:10    Post subject: Reply with quote

LonerD wrote:
Или плагин Autorun выгружается? (по какой причине это может происходить? командой выгрузки плагинов не пользуюсь). Или работа назначенных при запуске переменных не зависит от него?

Да, переменные окружения после создания не зависят от состояния запуска Autorun.

Больше добавить ничего не могу, не сталкивался с таким. Если при возникновении проблемы посмотреть переменные плагином EnvVariables, их содержимое выглядит нормально?
Back to top
View user's profile Send private message
LonerD



Joined: 04 Jan 2011
Posts: 1168
Location: Донецк

Post (Separately) Posted: Sun Jul 16, 2023 23:42    Post subject: Reply with quote

Loopback wrote:
Если при возникновении проблемы посмотреть переменные плагином EnvVariables, их содержимое выглядит нормально?

Я несколько раз быстренько перезапускал Тотал, а потом только вспоминал, что забыл посмотреть список переменных. Rolling Eyes
_________________
Win11 x64 Eng | TC DreamLair eternal pre-α
Back to top
View user's profile Send private message
LonerD



Joined: 04 Jan 2011
Posts: 1168
Location: Донецк

Post (Separately) Posted: Fri Jul 28, 2023 23:18    Post subject: Reply with quote

Опять отвалились переменные на ровном месте.

В плагине Autorun прописано так:
Code:
SetEnv /A /EV PATH ;%commander_path%
SetEnv /A /EV PATH ;%commander_path%\System


В %commander_path%\System лежит файл Hidcon.exe для скрытия консольных окон. И есть несколько пользовательских команд, начинающихся с конструкции:
cmd=Hidcon.exe %comspec% /c

Запускаю последовательно несколько команд, потом оп - через пару секунд следующая уже не запускается. Посмотрел плагином EnvVariables - добавленные значения в переменной PATH пропали. Перезапустил Тотал, попробовал снова, воспроизвести пропадание не удалось.

Заметил ошибки в моей записи.
1. Для чего у меня было /EV - не знаю.
2. Точку с запятой правильнее ставить в конце пути, иначе в тексте переменной получится ;;
Правильно будет вот так:
Code:
SetEnv /A PATH %commander_path%;
SetEnv /A PATH %commander_path%\System;


-----------------------
Но выявил и другую проблему, которая касается непосредственно плагина.
Время от времени перезапускаю Тотал. Не закрываю, а перезапускаю утилитой Tinny TC Restarter. Оказывается, в конце переменной PATH накапливаются записи вида
Code:
;D:\TCDL;D:\TCDL\System;D:\TCDL;D:\TCDL\System;D:\TCDL;D:\TCDL\System;D:\TCDL;D:\TCDL\System;

Может, Windows время от времени запускает внутреннюю проверку состояния системы, обнаруживает это непотребство и удаляет подозрительные записи.

По справке:
При использовании опции /A плагин проверяет наличие добавляемого текста в конце значения переменной и не добавляет его повторно.
На деле это почему-то не работает.

Windows 11 x64, TC 11 RC3, Autorun 2.2.10 beta.
Попробовал более ранние версии Autorun - поведение то же самое.
_________________
Win11 x64 Eng | TC DreamLair eternal pre-α
Back to top
View user's profile Send private message
Loopback



Joined: 07 Sep 2009
Posts: 1291

Post (Separately) Posted: Sat Jul 29, 2023 22:25    Post subject: Reply with quote

LonerD wrote:
Запускаю последовательно несколько команд, потом оп - через пару секунд следующая уже не запускается. Посмотрел плагином EnvVariables - добавленные значения в переменной PATH пропали. Перезапустил Тотал, попробовал снова, воспроизвести пропадание не удалось.

Интересно, получается, что пропадают добавленные записи в PATH. В принципе, PATH достаточно критичная переменная, может это работа антивируса какого?

LonerD wrote:
1. Для чего у меня было /EV - не знаю.

Переключатель /EV остался от совсем ранних времён, когда он включал разворачивание переменных. Сейчас он ничего не делает, т.к. разворачивание включено по умолчанию, а отключается с помощью /EV-.

LonerD wrote:
2. Точку с запятой правильнее ставить в конце пути, иначе в тексте переменной получится ;;

А это зависит от конкретной системы, что туда записано. У меня в конце PATH нет точки с запятой. В принципе, в случае сомнений правильнее проверять наличие ; в конце исходной переменной перед дозаписью.

LonerD wrote:
Оказывается, в конце переменной PATH накапливаются записи вида

В принципе, тут всё согласно документации - проверяется текст в конце, а тут для каждой команды предыдущий текст будет другой. Т.е. чтобы всё сработало, надо устанавливать весь текст одной командой:

Code:
SetEnv /A PATH %commander_path%;%commander_path%\System;


Возможно, стоит добавить уточнение в справку.

LonerD wrote:
Может, Windows время от времени запускает внутреннюю проверку состояния системы, обнаруживает это непотребство и удаляет подозрительные записи.

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



Joined: 04 Jan 2011
Posts: 1168
Location: Донецк

Post (Separately) Posted: Sat Aug 05, 2023 21:22    Post subject: Reply with quote

Loopback wrote:
Т.е. чтобы всё сработало, надо устанавливать весь текст одной командой:

Code:
SetEnv /A PATH %commander_path%;%commander_path%\System;

Теперь всё отлично, лишние записи не появляются.
_________________
Win11 x64 Eng | TC DreamLair eternal pre-α
Back to top
View user's profile Send private message
yozhik



Joined: 04 May 2014
Posts: 181

Post (Separately) Posted: Mon Aug 07, 2023 02:32    Post subject: Reply with quote

Вот такой вариант окошка копирования F5/F6 в TC 11.00 на Win 10:


 И его код:

Это при шрифте для диалогов Segoe UI, 9.
Loopback
В коде, в 64-битной части есть пара строк:
Code:
AddControl                "Button" 0  ""

Без них отказывались работать строки с Button 1, вот такие:
Code:
AddControl /X:-5  /W:5  "Button" 1  "" #MD5

Точнее, вначале когда я написал строку с Button 1, она не работала. Потом стал экспериментировать, проверять где какие instance, и при добавлении Button 0 вдруг заработала Button 1. Потом, после того, как весь код был готов, Button 1 вроде заработала и без Button 0. Но я уж не стал ничего трогать, оставил нули на всякий пожарный. Как думаете, почему такое поведение? Я сам ума не приложу.
Back to top
View user's profile Send private message
Loopback



Joined: 07 Sep 2009
Posts: 1291

Post (Separately) Posted: Mon Aug 07, 2023 23:20    Post subject: Reply with quote

yozhik
Трудно сказать. Нулевой экземпляр не имеет смысла, т.к. нумерация начинается с 1, для него никогда не будет найден хэндл контрола и следовательно, не будет производиться никаких действий. А вот почему сначала не работало - в прошлом году мы уже сталкивались с каким-то странным несовпадением экземпляров в x64, возможно это что-то из той же оперы.
Back to top
View user's profile Send private message
yozhik



Joined: 04 May 2014
Posts: 181

Post (Separately) Posted: Mon Aug 07, 2023 23:57    Post subject: Reply with quote

Сегодня повторилось с двумя другими диалогами. В одном код «промахивался» мимо экземпляров, пока не подставил вызов нулевого — сразу заработало. А во втором случае уже в настроенном (вчера) диалоге перестал отображаться назначенный кнопке текст (я вместо «Справка» назначил «?»). Вписал в код вызов нулевого — всё встало на места.

Скажите, пожалуйста, а не трудоёмко ли будет добавить в AddControl возможность вместо текста назначать иконку? Например, как-то так:
Code:
AddControl /W:-40 "TButton" 3 %ICON%,8

В переменной адрес к *.dll, и после запятой номер иконки в наборе. Я сегодня дооолго искал хоть какой подходящий символ для кнопки «Дерево». Не нашёл, нету. А так бы что-нибудь такое поставил , очень было бы удобно.
Back to top
View user's profile Send private message
Loopback



Joined: 07 Sep 2009
Posts: 1291

Post (Separately) Posted: Tue Aug 08, 2023 23:22    Post subject: Reply with quote

yozhik wrote:
Вписал в код вызов нулевого — всё встало на места.

Я так понимаю, это только в x64? Такое впечатление, что что-то не инициализируется без предварительного холостого прогона, но что именно, неясно. Посмотрел наиболее очевидные места, проблем не увидел. Хорошо бы, конечно, выделить минимальный код, при котором проблема повторяется...

yozhik wrote:
а не трудоёмко ли будет добавить в AddControl возможность вместо текста назначать иконку?

Без сложностей иконку можно поставить только на стандартные кнопки и static-контролы. Наследники static в формах TC не используются, остаются только кнопки. В их основе стандартный button, но это же delphi/lazarus, как они себя поведут, без тестов непонятно. Если нормально, то должно быть не слишком сложно.
Back to top
View user's profile Send private message
yozhik



Joined: 04 May 2014
Posts: 181

Post (Separately) Posted: Wed Aug 09, 2023 01:46    Post subject: Reply with quote

Loopback wrote:
Я так понимаю, это только в x64?

Нет-с. И в 32-битном тоже.
Loopback wrote:
выделить минимальный код, при котором проблема повторяется...

Вот к счастью у меня сразу воспроизвелось. Уточним: Тотал 11.00 32/64, Windows 10 21H2 64bit. Запускаю 32-битный TC:

Я прошу прощения, давайте я вам откопирую всё, что для ModifyDialogs наваял (в следующем посте сообразил и сделал краткий код как вы просили). Я себе плохо представляю механизмы всей этой кухни, а вдруг там что-то ещё влияет. Но у меня всё прокомментировано, так что вам будет удобно найти нужный отрывок. Сейчас у меня все нулевые вызовы закомментированы. При первом же запуске артефакт проявляется в 2х диалогах: распаковки и атрибутов (на скринах). После раскомментирования нулевых начинает отображаться «?», как и задумано.
 Изменённые диалоги

Loopback wrote:
Без сложностей иконку можно поставить только на стандартные кнопки и static-контролы.

Ну, и прекрасно, хватит за глаза. Давайте, пожалуйста, попробуем. Если получится, то я бы все «Справки» и «Деревья» под аккуратные контурные иконки «спрятал» Rolling Eyes, гораздо бы эргономичней вышло. Можно пока начать только с кнопок — на них иконки точно нужны. А вот пригодится ли это для static-контролов я пока не приглядывался.


Last edited by yozhik on Thu Aug 10, 2023 20:13; edited 1 time in total
Back to top
View user's profile Send private message
lz57005



Joined: 05 Mar 2020
Posts: 26

Post (Separately) Posted: Wed Aug 09, 2023 22:29    Post subject: Reply with quote

LonerD wrote:
Другими словами немного подробней.
Есть мой Тотал, настроенный. В Autorun прописан запуск программы, она запускается и работает в фоне. Я могу запускать несколько копий моего Тотала и закрывать их. Всё это время программа должна быть запущена. Когда я закрою последнюю копию моего Тотала - программа должна выгрузиться.
В то же время параллельно я могу запускать чистый Тотал или чужие сборки. Они никак не должны влиять на запуск и закрытие программы.

Очевидное решение использовать как признак запуска программы наличие/отсутствие PID c нужным ImagePath, а не именем процесса, а при закрытии проверять аналогично процессы с путём %commander_exe% и закрывать программу тоже не по имени, вот пример:

MultiTCruncloseExample.7z

Code:
autorun.cfg
...
ShellExec /SW_HIDE "%COMMANDER_PATH%\utils\StartDummy.bat"
...
Pragma AutorunFinalizeSection
...
ShellExec /SW_HIDE "%COMMANDER_PATH%\utils\StopDummy.bat"


cmd, nircmd, pathpid (самописная утилита которая выдаёт в stdout/stderr pid первого процесса с путём из параметра запуска)

Dummy.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 ... 123, 124, 125 ... 133, 134, 135  Next
Page 124 of 135

 
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