Страница 13 из 41
Добавлено: Пн мар 01, 2010 17:10
MVV
likhobory писал(а):не обновляется размер файла при его редактировании непосредственно из ВП пока не выполнишь cm_RereadSource. При этом, если этот же файл отображается на противоположной реальной панели - там все обновляется
Значит, ТК не запрашивает содержимое виртуальной панели, а содержимое противоположной обновляет. К сожалению, тут я вряд ли смогу что-то сделать, т.к. проследить изменение файла обычными средствами FS-модуля невозможно, кроме того, у меня нет фоновых потоков, только основной, который вызывается из ТК только при необходимости, к которой не относится обновление виртуальной панели при изменении физического файла.
Добавлено: Чт мар 04, 2010 18:08
Вахмурка
Вопрос по команде cd:
Изменяет текущую папку в пределах текущего скрипта
Смущают последние слова. Получается, что команда cd влияет только на скрипт. Нельзя ли, находясь в одной виртуальной папке, по данной команде перейти в другую, как это делается в DOS:
Если можно, то как? Если нельзя, то нет ли планов изменить положение?
Добавлено: Пт мар 05, 2010 13:31
MVV
Я ж не могу сказать ТК изменить папку. Хотя, разве что той функцией, которая в фоновом потоке посылает сообщение WM_COPYDATA. А вообще, команда <cd задумывалась для того, чтобы во время выполнения скрипта можно было установить папку-основу для относительных имен файлов, ведь скрипт может быть запущен и не из нужной папки. В общем, лучше сделать отдельные команды, или особый флаг для команды cd, потому что во-первых не всегда удобно менять текущий путь при запуске скрипта, во-вторых, долго - пока создатся поток, пока отправится-обработается сообщение и т.д. и т.п.
Кстати, есть идея. Я могу по обычной команде cd физически изменять текущую папку - это будет своего рода команда-исключение, которая не начинается символом '<', но обрабатывается VP, так как ТК ленится обрабатывать ее в FS-панелях.
И тут проблема. Чтобы изменить путь в пределах VP, я должен знать имя VP-модуля, в противном случае перейти в папку внутри него невозможно. В информации команды cd же его не содержится, если только не указан полный путь, полученный с помощью Ctrl+Shift+Enter. Можно, конечно, добавить параметр в файл конфигурации... Еще предложения?
Добавлено: Пт мар 05, 2010 14:44
Вахмурка
Почти во все команды первым же параметром входит то, что ты называешь <virtual_path>. Если я правильно успел понять, "\" - это корень VirtualPanel, "\abc" - ее подпапка abc, и т.д. То есть работать с директориями VirtualPanel умеет, иначе она бы не знала что куда класть (скажем, по команде <put). А тут не надо ничего никуда копировать, надо осуществить переход к указанной виртуальной папке. Причем VirtualPanel вовсе не обязана заботиться о том, чтобы папка существоваала: если юзверь ошибся в команде, ничего не происходит.
Все же, видимо, я не понял твою предыдущую мысль.
Добавлено: Пт мар 05, 2010 15:20
MVV
Хорошо, я поясню. В пределах виртуальной панели пути начинаются с символа обратного слэша, например, "\abc", и обрабатываются так же. Но для ТК этот путь будет иным: "\\\Virtual Panel (или иное имя модуля)\abc". Получается, если юзер пишет "cd \abc", я должен сказать ТК, что надо перейти в папку "\\\Virtual Panel (или иное имя модуля)\abc". И проблема как раз в том, что я не знаю, как у моего модуля выглядит это самое "Virtual Panel (или иное имя модуля)". Я пытался предложить Гислеру добавить это имя модуля в информационную структуру, которую ТК присылает при инициализации модуля (в то время я пытался решить проблему возможности загрузки нескольких независимых VP, и это позволило бы иметь для каждой независимую секцию в файле конфигурации FS-модулей), но идея не прижилась, скажем так. Это абсолютно несложно - добавить поле к структуре - ничего не пострадает, но не я командую парадом:) ОК, я предложил добавить поле еще раз, с новыми обстоятельствами, посмотрим...
Добавлено: Сб мар 06, 2010 12:28
Вахмурка
Вот еще серьезный косяк. Заметил давно, но не мог установить закономерность.
Как мы выполняем команду Shut down/Restart/Logoff? Закрываем ли мы перед этим все программы? Закрываем ли мы Тотал? Для меня на первый вопрос ответ, как правило, положительный, на второй - обычно отрицательный.
Так вот, при "штатном" закрытии Тотала база будет
сохраняться в этот файл при финализации
, а вот при "нештатном" (если его закрытие выполняет не пользователь, а ОСь) - нет. Видимо, все дело в обработке сообщения WM_CLOSE (могу ошибаться, давно это было

)
То есть кладем что-либо в VirtualPanel и, не закрывая Тотала, даем команду Logoff Windows. При запуске Тотала база "старая" (что подтверждается и временем записи тоже).
Добавлено: Сб мар 06, 2010 13:20
MVV
Да, есть такое дело. Проблема в том, что ТК не реагирует на сообщение WM_ENDSESSION, а мне, чтобы на него реагировать, надо заводить фоновый поток чисто для проверки сообщений (возможно, при этом нужно будет создавать невидимое окно, хотя вроде есть более цивильные способы), или же субклассить главное окно ТК, что не есть хорошая идея. В принципе, наверное, можно и хук написать, но опять же это немного выходит за рамки (да и не люблю я городить огород без крайней необходимости).
Впрочем, возможно, я напишу фоновый поток, который будет ловить сообщение WM_ENDSESSION, заодно можно будет сохранять базу с заданным интервалом времени (в базе уже есть флаг модифицированности, поэтому если изменений не было, будет легко понять, что сохранять не нужно).
Ну и, конечно же, не стоит забывать, что всегда могут возникнуть новые нештатные ситуации. Например, если кто-то убивает процесс ТК, вообще нет возможности узнать об этом, а даже если узнаешь, отреагировать не успеешь.
Добавлено: Сб мар 06, 2010 13:49
Вахмурка
Например, если кто-то убивает процесс ТК, вообще нет возможности узнать об этом, а даже если узнаешь, отреагировать не успеешь.
Ну, это-то понятно. Аналогично пропадают изменения в wincmd.ini.
Тестирование твоего плагина совпало для меня с тесированием нового компа и новой оси, поэтому Тотал падал у меня частенько, вот я и не распознал косяк вовремя.
А не удастся ли опционально сохранять базу после каждого изменения ВП? Видимо, это скажется на быстродействии, но раз все так плохо, я готов пожертвовать скоростью.
Добавлено: Сб мар 06, 2010 15:05
MVV
Это сильно замедлит скорость при работе с большой базой. Даже если сохранение будет длиться хотя бы секунду, ты заметишь это.
В общем, ловить сообщения в фоновом потоке не вышло, но натравить хук на поток ТК, в котором находится главное окно, получилось - моя хук-функция получает сообщение WM_QUERYENDSESSION.
Странно, что ТК молча схлопывается, получив сообщение WM_QUERYENDSESSION, при этом не выгружая модули - по идее, получив это сообщение, приложения должны лишь сказать, можно ли завершать работу, но никак не закрываться, тем более без сохранения данных. А тут я запускаю ТК, открываю блокнот, пишу там че-то (гарант того, что система не завершит работу по команде выключения - просто надо нажать Отмена на вопрос блокнота о закрытии), жму выключить комп, ТК закрывается (причем, судя по логу, без выгрузки модулей)...
В общем, я исследовал более подробно обработку сообщений WM_QUERYENDSESSION и WM_ENDSESSION и заметил, что если приложение возвращает 1 на WM_QUERYENDSESSION (в противном случае оно вынудит систему прекратить попытку завершения работы), то после получения ответа на сообщение WM_ENDSESSION система в любом случае убьет приложение. Собственно, это нам мало что дает, т.к. мы и так знаем, что при получении сообщения WM_ENDSESSION приложение должно сохранять все данные и не возвращаться из процедуры обработки сообщения до того как.
У меня получается перехватить сообщение WM_ENDSESSION с помощью хука типа WH_CALLWNDPROC - в аккурат перед тем, как оно поступит окну ТК, так что выполнить сохранение состояния во время обработки хук-сообщения можно легко.
Добавлено: Пн мар 08, 2010 12:10
MVV
В общем, путем перебора установленных в ТК модулей файловых систем и сверки их путей со своим удается определять имя модуля, так что команда cd работает.
Диалог конфигурации теперь запускается в отдельном потоке и не блокирует ТК, позволяя, например, копировать пути к файлам значков или писать скрипты, читая открытое окно с командами.
Virtual Panel 1.0.0.500:
+ поддержка внутренних ассоциаций в ТК 7.51 и более поздних
+ сохранение состояния при завершении работы Windows
+ корректный многопоточный доступ к виртуальной системе
+ немодальный диалог конфигурации
+ поддержка стандартной в ТК команды cd
Как обычно, надеюсь, ничего ранее работающего не сломал.

Добавлено: Пн мар 08, 2010 14:35
Вахмурка
поддержка внутренних ассоциаций в ТК 7.51 и более поздних
...а также дележ шкуры неубитого медведя

С нетерпением ждем-с.
сохранение состояния при завершении работы Windows
Работает! Ура! Ты гений!
поддержка стандартной в ТК команды cd
А вот тут чегой-то не получаетя. Можно примерчиком в народ кинуть?
Добавлено: Пн мар 08, 2010 14:54
Avada
Вахмурка писал(а):...а также дележ шкуры неубитого медведя
Я вам не скажу за других медведей, но этот явно убит.

Качество шкуры проверялось мною на приватных версиях 7.51. В том числе и на последней бета-версии 7 с Virtual Panel 1.0.0.500.
Добавлено: Пн мар 08, 2010 15:00
MVV
Вахмурка писал(а):...а также дележ шкуры неубитого медведя

С нетерпением ждем-с.
Угу, ждем-с.

Кстати, счастливые обладатели бет 7.51 могут проверить работоспособность функции уже сейчас.
(а у меня, если что, будет время исправить, если вдруг что не так)
Работает! Ура! Ты гений!
Да уж, мутить хук ради ерунды. С ним еще проблемы были при установке одного и того же модуля под разными именами - ТК вылетал при выгрузке, т.к. один модуль грузился дважды, создавалось два хука, а т.к. пространство глобальных имен общее, выгружался лишь последний.

Но я добавил проверку, чтоб не допустить повторной инициализации. Надеюсь, Гислер заметит темку, где я описывал, как сохранить настройки ТК при эавершении работы винды, и извращения с хуком не понадобятся.
поддержка стандартной в ТК команды cd
А вот тут чегой-то не получаетя. Можно примерчиком в народ кинуть?
Да как же, запросто:
Код: Выделить всё
cd %temp%
cd "c:\documents and settings"%username%
Вообще, у вас это пока может не работать, переменные окружения будут работать в следующем релизе.

А эти должны:
Код: Выделить всё
cd c:\
cd test
cd ..\test
cd \
cd \test\..
cd d:\windows
Хватит примеров? Если указываешь букву диска и двоеточие в начале пути, уходишь из временной панели, иначе - все в пределах временной панели - относительно корня временной панели или текущей папки. Все как и в обычной панели ТК.
Без символа '<' перед командой!
Добавлено: Пн мар 08, 2010 15:33
Вахмурка
Мистика какая-то. Мало того, что я твердо помню, что выдавал все эти команды, так еще и история командной строки, которая, в отличие от меня, склерозом не страдает, это подтвердила. Даже запросил номер релиза (<properties), чтобы убедиться, что посталена имена пятисотка. Так вот, тогда они не работали, что и побудило пожаловаться. А сейчас все пучком. Видно, перезагрузка помогла, иного объяснения не вижу. Так еще раз троекратное спасибо (третье, повторно - за "ерунду").
"Это не ерунда, это совсем даже не ерунда, дружище Биттнер. Особенно в таком деле!" ((С) группенфюрер Мюллер)
Добавлено: Пн мар 08, 2010 15:41
MVV
М-да, полтергейст прямо. Объяснить не могу, разве что винду ты замучал вконец, что она не пересылала сообщение WM_COPYDATA окну ТК)) или не давала VP создать фоновый поток для его пересылки.
Ну, про ерунду - это я образно. А так - согласен, что функция полезная, иначе бы фиг делал.
Многопоточный доступ у меня уже есть, можно потихоньку вводить еще один поток для сохранения базы с заданным интервалом времени.