Страница 4 из 7

Добавлено: Сб авг 27, 2011 18:36
Flasher
ask-rus писал(а):Значит, не решение.
Логики в данном утверждении - ноль...
ask-rus писал(а):С этим есть проблема, существенная.
Ничего удивительного. Нет никаких функций в TCFS2, которые убивают ждущий своей задачи процесс. Ставь меньше паузу, раз так быстро надо повторно переключаться. Либо с апдейтом по вышибанию процесса обращайся к автору.

Добавлено: Сб авг 27, 2011 18:49
ask-rus
Flasher писал(а):Логики в данном утверждении - ноль...
Да, это именно утверждение. См. задачу на тот момент (последние два слова).
Flasher писал(а):Либо с апдейтом по вышибанию процесса обращайся к автору.
Пойду обращусь.

Добавлено: Сб авг 27, 2011 18:52
Flasher
ask-rus писал(а):Да, это именно утверждение.
Это утверждение ни в какие ворота. См. что написано здесь касаемо флага. Твоя команда и так одна (первая)...

Добавлено: Сб авг 27, 2011 18:59
ask-rus
Flasher писал(а):Это утверждение ни в какие ворота.
Не в твои?
Flasher писал(а):См. что написано здесь касаемо флага.
Flasher писал(а):Короче каждой кнопке свой флаг (свободный бит либо ключ в ini). Уж с двумя-то кнопками разобраться самостоятельно точно не проблема.
ask-rus писал(а):одной командой
Одна кнопка.
Flasher писал(а):Твоя команда и так одна (первая)...
Покажи эту команду.

Добавлено: Сб авг 27, 2011 19:12
Flasher
Как говорит Avada - "ещё раз и больше ни разу":
Flasher писал(а):либо пользоваться только подобными кнопками/командами для всех сменных баров (со своим битом каждая, естественно).
ask-rus писал(а):Покажи эту команду.
С некоторой поправкой:
TCFS2.exe /ef "set_tcini(TCFS2, Bar, 1) tem(em_1), test(tcini(TCFS2, Bar, #)!=1) | set_tcini(TCFS2, Bar, 0) tem(em_2) delay(15000) tem(em_1)"
Хотя MVV писал, что должно и без этого при проверке на ноль срабатывать.

Добавлено: Сб авг 27, 2011 19:34
ask-rus
Flasher писал(а):либо пользоваться только подобными кнопками/командами для всех сменных баров (со своим битом каждая, естественно).
Тогда стояла и до сих пор стоит проблема с двумя нажатиями (первая часть цитируемого). А главной же проблемой является
Flasher писал(а):ждущий своей задачи процесс
Бессмысленные хождения по кругу пользы никому не принесут.

Добавлено: Сб авг 27, 2011 19:40
Flasher
ask-rus писал(а):и до сих пор стоит проблема с двумя нажатиями
Никаких повторных ("двух") нажатий не требуется. Проверено.
ask-rus писал(а):Бессмысленные хождения по кругу пользы никому не принесут.
Повторение одного и того же в твоём случае и есть хождение по кругу. Жди ответа автора.

Добавлено: Сб авг 27, 2011 19:46
ask-rus
Flasher писал(а):Никаких повторных ("двух") нажатий не требуется. Проверено.
Почему-то, первое переключение у меня уже требует двойного нажатия. Условия те же?

Добавлено: Сб авг 27, 2011 19:51
Flasher
При чём тут условия? Ты команду с поправкой вызываешь из обеих панелей или что?

Добавлено: Сб авг 27, 2011 19:55
ask-rus
Flasher писал(а):При чём тут условия?
Думаю, может ты спутал em_1 с em_2.
Flasher писал(а):Ты команду с поправкой вызываешь из обеих панелей или что?
Сначала я её вызываю с одной панели и жду завершения операции. Нет успеха, т. к. приходится нажимать на кнопку дважды.

Добавлено: Сб авг 27, 2011 20:07
Flasher
Сейчас проверил с ожиданием - действительно срабатывает только с повторного, хотя такого не должно быть. Это косяк программы. Нужно у MVV спросить.

Добавлено: Сб авг 27, 2011 20:11
MVV
3. Выполняем команду #1 и наблюдаем смену панели уже на 3-6 сек. (не 15!).
Судя по всему, срабатывает ещё незавершённая команда из шага 1, которая заканчивает ожидание. Ведь остановить ожидание нельзя. И прежде запущенная команда после ожидания не может узнать, она ли переключала на вторую панель.
#1 TCFS2.exe /ef "set_tcini(TCFS2, Bar, 1) tem(em_1), test(tcini(TCFS2, Bar, #)) | set_tcini(TCFS2, Bar, 0) tem(em_2) delay(15000) tem(em_1)"
При беглом рассмотрении не понял, почему при Bar != 0 туда пишется 1, а если равно 0, то 0, а не наоборот. И логичнее было бы писать в Bar номер, совпадающий с номером юзер-команды.
ask-rus писал(а):Необходимо их объединить (усомнился в своих силах) и получить Открытие расширенной панели инструментов (em_2) с автоматическим возвратом на главную (em_1) через 15 сек с отменой (открытие главной и сброс отсчета времени, или без сброса по возможностям) одной командой.
Чтобы решить проблему, нужно сделать так:

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

[Items]
set_bar=set_tcini(TCFS2, Bar, 1) tem(em_bar1), test(#1 == 1) | set_tcini(TCFS2, Bar, 2) tem(em_bar2), test(#1 == 2) | set_tcini(TCFS2, Bar, 3) tem(em_bar3), test(#1 == 3) ; | ... создать блок для каждой панели

cmd1=set_tcini(TCFS2, Cmd1, #1) 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, # == #1), run_item(set_bar, 1))
cmd1loader=run_item(cmd1, GetTickCount)

cmd2=set_tcini(TCFS2, Cmd1, 0) tem(em_1)

[Macros]
tt_GetTickCount=65573
GetTickCount=msg($433, tt_GetTickCount)				; Возвращает количество миллисекунд с момента загрузки Windows
При этом запускать команду cmd1 необходимо с параметром GetTickCount - этим мы укажем ей текущий номер сеанса. Можно сразу через cmd1loader:

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

TCFS2 /ei cmd1loader
Команда, возвращающая GetTickCount, появляется в TCFS2Tools, начиная с версии 1.4.1.114 (чуть позже выложу).

Добавлено:

Эх, всё равно не работает, я и забыл, что подстановка параметров у меня ленивая. То есть, параметр не вычисляется при подстановке. Получается, что GetTickCount каждый раз вызывается по новой, и значения получаются разные. Похоже, для таких задач необходимо добавить псевдо-параметр, обозначающий идентификатор сеанса TCFS2 (банально значение GetTickCount в момент запуска программы) - так можно будет безошибочно различать сеансы.

Добавлено: Сб авг 27, 2011 20:34
Flasher
MVV писал(а):При беглом рассмотрении не понял, почему при Bar != 0 туда пишется 1, а если равно 0, то 0, а не наоборот.
См. выше, добавил !=1 красным. Т.е. если не равно 1, то ставим 1, если равно 1, то 0. Но даже так глючит.
MVV писал(а):При этом запускать команду cmd1 необходимо с параметром GetTickCount - этим мы укажем ей текущий номер сеанса.
А что именно даст этот номер сеанса? Не лучше сделать предложенное (функция, убивающая все процессы-дубли с другим PID)?

Добавлено: Сб авг 27, 2011 20:38
MVV
Предложенное где? И потом, определять процессы-дубли и убивать их - явно задача не для TCFS2. И вообще, убивать процессы - не самая лучшая идея.

А номер сеанса - это почти PID, но уникальный для всех процессов, запущенных во время всей сессии Windows, в то время как PID могут повторяться через некоторое время (после завершения процесса с таким PID).

А даст он то, что cmd1, запущенная ранее, после ожидания увидит, что номер сеанса, записанный в Cmd1, изменился (т.к. после неё cmd1 уже запускали повторно), и завершит свою работу, не переключая больше ничего.

Добавлено: Сб авг 27, 2011 20:49
Flasher
MVV писал(а):Предложенное где?
Тебе ask-rus в тематичном топике ссылку дал. А ты не видишь?
MVV писал(а):И потом, определять процессы-дубли и убивать их - явно задача не для TCFS2. И вообще, убивать процессы - не самая лучшая идея.
Задача для любой программы, чтобы команды срабытывали корректно, и при повторном обращении к похожей команде функция переставала учитываться. В данном случае delay. А каким образом это будет реализовано - другой вопрос. Но такая каша в несколько команд, которую ты привёл мне лично не нравится. Т.е. твоя идея никак не лучше моей, ИМХО.
MVV писал(а):А номер сеанса - это почти PID, но уникальный для всех процессов, запущенных во время всей сессии Windows, в то время как PID могут повторяться через некоторое время (после завершения процесса с таким PID).
Вот имено, что после завершения. Значит никаких проблем это не вызовет.
MVV писал(а):А даст он то, что запущенная ранее команда, увидев после ожидания, что номер сеанса, записанный в Cmd1, изменился, поймёт, что ей нужно прервать свою работу.
Геморройный подход. Представь сколько таких команд нужно понаписать в ini для схожих задач, ужас...
А так была бы одна маленькая запись с названием функции забивки процессов-дублей.