Автоматическая смена панели инструментов, как?

Обсуждение Total Commander. Установка, использование, настройка, решение проблем, скрытые функции. Обсуждение новых версий.

Модераторы: d-view, Моторокер, Avada, CaptainFlint, Nik

Аватара пользователя
MVV
Сообщения: 4815
Зарегистрирован: Чт окт 15, 2009 10:58
Откуда: Ростов-Дон

Сообщение MVV »

Не, не вижу, оно появилось уже после того, как я зашел в эту тему.
Геморройный подход. Представь сколько таких команд нужно понаписать в ini для схожих задач, ужас...
Геморрой - это встраивание в TCFS2 функции убийства запущенных ранее задач. Как ты определишь, какие из них хорошие, а какие - плохие? И вообще, не хочу я убивать никакие процессы.

Проблема подобного плана может возникнуть только для команд, которые чего-то долго ждут, а потом что-то ещё делают. И возникла она в первый раз. ИМХО, куда проще для каждой такой команды, которая ведёт себя похожим образом (а их вряд ли будет много) завести отдельный INI-ключик в секции TCFS2, в котором сохранять номер сеанса.
Flasher писал(а):Сейчас проверил с ожиданием - действительно срабатывает только с повторного, хотя такого не должно быть. Это косяк программы. Нужно у MVV спросить.
Напишите мне в личку подробно, какая команда работает не так, как ожидается, я путаюсь в вашей беседе.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

MVV писал(а):Не, не вижу, оно появилось уже после того, как я зашел в эту тему.
Давно же ты зашёл (и не вышел), однако. :)
MVV писал(а):Как ты определишь, какие из них хорошие, а какие - плохие?
Это не требуется. Логика проста: все - плохие.
MVV писал(а):Проблема подобного плана может возникнуть только для команд, которые чего-то долго ждут, а потом что-то ещё делают. И возникла она в первый раз.
Всё периодически появляется первый раз, в частности недавний разговор по /p (pause).
MVV писал(а):ИМХО, куда проще для каждой такой команды, которая ведёт себя похожим образом (а их вряд ли будет много) завести отдельный INI-ключик в секции TCFS2, в котором сохранять номер сеанса.
Приведи пример с тремя подобными командами с этим ini ключиком, я пока себе не очень представляю, как это уменьшит объём написанного.
MVV писал(а):Напишите мне в личку подробно, какая команда работает не так, как ожидается, я путаюсь в вашей беседе.
Я же написал какая ("См. выше, добавил !=1 красным.").
Аватара пользователя
MVV
Сообщения: 4815
Зарегистрирован: Чт окт 15, 2009 10:58
Откуда: Ростов-Дон

Сообщение MVV »

Flasher писал(а):Давно же ты зашёл (и не вышел), однако. :)
Я около часа писал ответ) как видишь, в нём есть цитаты частей постов, которые вы за это время уже успели поудалять или поисправлять. :D
Flasher писал(а):
MVV писал(а):Как ты определишь, какие из них хорошие, а какие - плохие?
Это не требуется. Логика проста: все - плохие.
Хреновая логика. Будут висеть на ожидании двух независимых событий два процесса, а ты оба прибьёшь.
Flasher писал(а):Приведи пример с тремя подобными командами с этим ini ключиком, я пока себе не очень представляю, как это уменьшит объём написанного.

Код: Выделить всё

cmd1=set_tcini(TCFS2, cmd1s, #S) команда1 команда2 ... delay(10000) if(tcini(TCFS2, cmd1s, # == #S), командаN+командаM+..., ничего)
cmd2=set_tcini(TCFS2, cmd2s, #S) команда1 команда2 ... delay(10000) if(tcini(TCFS2, cmd2s, # == #S), командаN+командаM+..., ничего)
Аналогично для остальных команд, которые чего-то ждут. Ранее мы уже писали "критическую секцию" для команд, чтобы не допустить выполнения нескольких копий команды одновременно, проверка сеанса выполняется аналогичным образом, разве что не блокирует вход в команду для новых копий, а наоборот, указывает уже запущенным, что их прервали. Символом #S обозначен номер сеанса (пока не знаю, как лучше назвать, но точно с решётки) - это будет внутренний макрос TCFS2.
Flasher писал(а):
MVV писал(а):Напишите мне в личку подробно, какая команда работает не так, как ожидается, я путаюсь в вашей беседе.
Я же написал какая ("См. выше, добавил !=1 красным.").
Ну попросил же нормальным языком написать, что и как не работает, и как должно работать. Это так сложно? Любишь ты стрелки кидать вместо того чтобы дать ответ на чётко поставленный вопрос. Очевидное для тебя может быть абсолютно неочевидным для других.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

MVV писал(а):Хреновая логика. Будут висеть на ожидании двух независимых событий два процесса, а ты оба прибьёшь.
Нормальная логика. Прибью два мешающих процесса. Вызывая команду я прекрасно осознаю, для чего это делается. Вариантов совпадения времени вызова разнородных команд, где используется delay, практически быть не должно.
MVV писал(а):Аналогично для остальных команд, которые чего-то ждут.
Ты привёл муляж, а для понимания требуются конкретные примеры, аналогично этому. Там у тебя явно не одна строчка.
MVV писал(а):Ну попросил же нормальным языком написать, что и как не работает, и как должно работать. Это так сложно? Любишь ты стрелки кидать вместо того чтобы дать ответ на чётко поставленный вопрос.
Какие стрелки? Каким языком? Окстись. Я дал ссылку с ответом на чётко поставленный вопрос
MVV писал(а):какая команда работает не так, как ожидается
MVV писал(а):Очевидное для тебя может быть абсолютно неочевидным для других.
В данном случае это к тебе больше относится. Я в поставленной конкретно вопросе дополнительные не увижу при всём желании.

А теперь в подробностях (то, что сперва умолчалось в запросе):

Команда должна сменять панели при первом нажатии кнопки, т.к. происходит проверка значения ключа. В одном случае ключ при несовпадении принимает значение 1, и выполняется юзеркоманда вызова дефолтного бара, в другом - ноль, и выполняется юзеркоманда вызова второго бара. Но почему-то команда срабатывает верно только со второго раза.
Аватара пользователя
MVV
Сообщения: 4815
Зарегистрирован: Чт окт 15, 2009 10:58
Откуда: Ростов-Дон

Сообщение MVV »

Flasher писал(а):
MVV писал(а):Хреновая логика. Будут висеть на ожидании двух независимых событий два процесса, а ты оба прибьёшь.
Нормальная логика. Прибью два мешающих процесса. Вызывая команду я прекрасно осознаю, для чего это делается. Вариантов совпадения времени вызова разнородных команд, где используется delay, практически быть не должно.
Повторюсь, хреновая логика. Невозможно знать наперёд, какие процессы будут запущены в тот момент, и никак нельзя слепо убивать всё, что попадёт под руку. Если ты считаешь, что тебе достаточно одной команды с delay, то тебе тем более не составит труда один раз написать строчку с запоминанием номера сеанса.
Flasher писал(а):
MVV писал(а):Аналогично для остальных команд, которые чего-то ждут.
Ты привёл муляж, а для понимания требуются конкретные примеры, аналогично этому. Там у тебя явно не одна строчка.
Там было через GetTickCount, который, как написано в дополнении, не работает. Вариант через номер сеанса куда проще (@S - псевдо-макрос, возвращающий этот самый номер, пока не знаю, как лучше его назвать):

Код: Выделить всё

cmd1=set_tcini(TCFS2, Cmd1, 0) run_item(set_bar, 1), test(tcini(TCFS2, Bar, # != 1)) | set_tcini(TCFS2, Cmd1, @1) run_item(set_bar, 2) delay(15000) if(tcini(TCFS2, Cmd1, # == @S), run_item(set_bar, 1))
Flasher писал(а):Какие стрелки? Каким языком? Окстись. Я дал ссылку с ответом на чётко поставленный вопрос
MVV писал(а):какая команда работает не так, как ожидается
Мог бы и подробнее написать, как именно не так она работает))
Flasher писал(а):
MVV писал(а):Очевидное для тебя может быть абсолютно неочевидным для других.
В данном случае это к тебе больше относится. Я в поставленной конкретно вопросе дополнительные не увижу при всём желании.
Если меня просят прояснить что-то, я обычно проясняю, а не начинаю возмущаться, что я это писал по сто раз на двадцати предыдущих страницах, и что ответ можно собрать из тех двух десятков постов.
Flasher писал(а):Команда должна сменять панели при первом нажатии кнопки, т.к. происходит проверка значения ключа. В одном случае ключ при несовпадении принимает значение 1, и выполняется юзеркоманда вызова дефолтного бара, в другом - ноль, и выполняется юзеркоманда вызова второго бара. Но почему-то команда срабатывает верно только со второго раза.
Это уже по существу. Можешь же, когда захочешь. :)
Обсуждение того, что конкретно и почему не работает в команде, я продолжу там.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

MVV писал(а):Невозможно знать наперёд, какие процессы будут запущены в тот момент, и никак нельзя слепо убивать всё, что попадёт под руку.
Почему это нельзя знать наперёд? С чего ты взял? А убивать не всё, что попадёт под руку, а все отличные от запускаемой копии TCFS2, которые мне нафиг не сдались, п.ч. я использую уже другую фичу, которой эти процессы, (а в 99% - один процесс) будет только создавать помехи.
MVV писал(а):Там было через GetTickCount, который, как написано в дополнении, не работает. Вариант через номер сеанса куда проще (@S - псевдо-макрос, возвращающий этот самый номер
Ну, это уже поприличней смотрится.
MVV писал(а):Мог бы и подробнее написать, как именно не так она работает))
Мог бы, если бы попросили, что конкретно требуется описать. Телепатией не владею.
MVV писал(а):Если меня просят прояснить что-то, я обычно проясняю, а не начинаю возмущаться, что я это писал по сто раз на двадцати предыдущих страницах, и что ответ можно собрать из тех двух десятков постов.
Не передёргивай. Возмущаться ты начал и ничего кроме команды не запросил, т.ч. неча пинять на зеркало.
MVV писал(а):Это уже по существу. Можешь же, когда захочешь
Я всегда могу и отвечаю, когда конкретизируют, а не раздувают сопли.
Аватара пользователя
Avada
Сообщения: 10541
Зарегистрирован: Пт авг 01, 2008 16:17
Откуда: Россия, Саратов

Сообщение Avada »

Flasher
MVV
А общаться без подобных обменов "личными любезностями" — никак? Обязательно нужно, чтобы модератор вмешался? Сто раз говорилось, что подобные вещи, если уж в них есть позарезная необходимость — в ЛС. Публичную перепалку прекращаем.
Даже самая богатая фантазия
Не представит себе наши безобразия.
Аватара пользователя
ask-rus
Сообщения: 2077
Зарегистрирован: Вт ноя 10, 2009 14:06
Откуда: Russian Federation

Сообщение ask-rus »

Задача более чем решена (MVV, с благодарностью).
«Минимализм - это кратчайший путь бесконечного стремления к идеалу»
«Не бойся, что не знаешь, - бойся, что не учишься» Китайская пословица
MC Hummer
Сообщения: 5
Зарегистрирован: Сб авг 20, 2011 18:34

Сообщение MC Hummer »

Решил не создавать новою тему, т.к. мой вопрос так же относится к панели инструментов.
Есть ли в ТС команда, переключающая режим сортировки каталогов с Всегда по имени на Как файлов (также и по времени), и возможность вынесения её на панель инструментов в виде кнопки?
Аватара пользователя
Avada
Сообщения: 10541
Зарегистрирован: Пт авг 01, 2008 16:17
Откуда: Россия, Саратов

Сообщение Avada »

MC Hummer
Очень интересная аргументация. Предлагается все функции, для которых теоретически можно создать кнопку, считать относящимися к панели инструментов и загонять в тему про их автоматическую смену?
Короче, замечание за оффтоп.
А встроенная команда, как тут потом sa правильно подсказал, это cm_SwitchDirSort. (Его пост я удалил, а свою первоначальную ошибку исправил прямо здесь, чтобы число оффтопных постов не умножать.)
Даже самая богатая фантазия
Не представит себе наши безобразия.
Аватара пользователя
ask-rus
Сообщения: 2077
Зарегистрирован: Вт ноя 10, 2009 14:06
Откуда: Russian Federation

Сообщение ask-rus »

Вновь возращаюсь к былому - смена одной панели инструментов на другую с автоматическим возвратом (15 сек). Как быть, если требуется "закрепить" вторую панель (кнопка), т.е. не дать ей смениться на первую через ~15 сек. Убивать процесс TCFS2.exe мы ведь так и не научились?
[em_1]
button=wcmicons.dll
cmd=OPENBAR %COMMANDER_PATH%\BAR\MAIN.BAR

[em_2]
button=wcmicons.dll
cmd=OPENBAR %COMMANDER_PATH%\BAR\EXT.BAR

[em_123]
button=%COMMANDER_PATH%\PLUGINS\Tools\TCFS2\TCFS2.exe
cmd=%COMMANDER_PATH%\PLUGINS\Tools\TCFS2\TCFS2.exe
param=/ei quick_bar
path=%COMMANDER_PATH%\PLUGINS\Tools\TCFS2\TCFS2.exe
quick_bar=set_tcini(TCFS2, #0, 0) run_item(set_bar, 1), test(tcini(TCFS2, Bar, #)==2) | set_tcini(TCFS2, #0, @sid) run_item(set_bar, 2) delay(15000) if(tcini(TCFS2, #0, # == @sid), run_item(set_bar, 1))
set_bar=if(#1 == 1, tem(em_1)) if(#1 == 2, tem(em_2)) if(#1 > 0, set_tcini(Layout, ButtonBar, 1), run_item(tb0)) set_tcini(TCFS2, Bar, #1), , set_bar(1)
«Минимализм - это кратчайший путь бесконечного стремления к идеалу»
«Не бойся, что не знаешь, - бойся, что не учишься» Китайская пословица
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

ask-rus
Так убивать процесс не обязательно через саму TCFS2. Создай kill-команду, повесь на клавиши и вызывай, когда требуется.
Аватара пользователя
ask-rus
Сообщения: 2077
Зарегистрирован: Вт ноя 10, 2009 14:06
Откуда: Russian Federation

Сообщение ask-rus »

Flasher
taskkill? Но как бы правильнее? По PID?
«Минимализм - это кратчайший путь бесконечного стремления к идеалу»
«Не бойся, что не знаешь, - бойся, что не учишься» Китайская пословица
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

ask-rus
Где ж ты PID возмешь-то?
taskkill /F /IM TCFS2.exe /T либо tskill TCFS2.exe
Аватара пользователя
MVV
Сообщения: 4815
Зарегистрирован: Чт окт 15, 2009 10:58
Откуда: Ростов-Дон

Сообщение MVV »

А смысл убивать? Просто выполняем команду, которая где-то прописывает флаг, который будет говорить первой копии, что возвращать панель не нужно. Или же тупо пишем 0 в ключ quick_bar секции TCFS2 - тогда работающая копия после ожидания увидит, что после неё уже похозяйничали, и ничего не сделает. Я думал, этот вопрос решен давным давно...
Ответить