|
![]() |
#1 |
Участник
|
В 2009-й использую:
X++: xSession::removeAOC(); SysTreeNode::refreshAll(); SysFlushDictionary::main(null); SysFlushAOD::main(null); SysFlushData::main(null); xSession::updateAOC(); |
|
![]() |
#2 |
Модератор
|
__________________
This posting is provided "AS IS" with no warranties, and confers no rights. |
|
![]() |
#3 |
Боец
|
см. также стандартную реализацию чистки кэша для АОСа (нескольких АОСов):
Каждый раз, когда мы выполняем такие действия как "Обновить AOD", "Обновить словарь данных" и т.д., АОС (ы) получает соответствующую команду посредством вызова метода SysEvent::fireEvent(SysEventType::XXXX); в классах SysFlushAOD, SysFlushData C помощью класса SysEventHandler АОС сканирует таблицу SysEvent на наличие команд и исполняет их. Запускается этот огород здесь: \Classes\Application\new Наверное этот механизм можно использовать и для клиентских сессий, подпилив совсем чуть-чуть. |
|
![]() |
#4 |
Участник
|
Никто не сталкивался с такой проблемой?: очищаем кэш, пользователь закрывает приложение, запускает снова и получает ошибку:
Чаще всего это происходит на Windows 7 но также бывает и на XP. Опытным путем выяснили, что ошибка возникает после SysFlushAOD::main(null), а именно после SysFlushAOD::doFlush() внутри main(). Лечится это только ручным удалением кэша с диска. Версия DAX2009 SP1 RU6. Последний раз редактировалось Bega; 28.02.2011 в 10:07. |
|
![]() |
#5 |
Боец
|
Цитата:
Сообщение от Bega
![]() Никто не сталкивался с такой проблемой?: очищаем кэш, пользователь закрывает приложение, запускает снова и получает ошибку:
Вложение 6628 Чаще всего это происходит на Windows 7 но также бывает и на XP. Опытным путем выяснили, что ошибка возникает после SysFlushAOD::main(null), а именно после SysFlushAOD::doFlush() внутри main(). Лечится это только ручным удалением кэша с диска. Я вот думаю, что нужно написать прямое удаление файлов кэша при выходе пользователя из приложения. SysFlush** как-то кривенько работает. |
|
![]() |
#6 |
Участник
|
Цитата:
Сообщение от DSPIC
![]() Сталкивались. Но у нас такой эффект проявлялся при смене компании, причем на совершенно стандартном приложении (AX2009). Да, пока ручками кэш не удалишь, клиент падает. Так и не вылечили - мы просто начали использовать одну компанию (она пости не использовалась).
Я вот думаю, что нужно написать прямое удаление файлов кэша при выходе пользователя из приложения. SysFlush** как-то кривенько работает. |
|
![]() |
#7 |
Боец
|
Цитата:
Сообщение от Bega
![]() Пытались удалять кэш при выходе, но не смогли найти то место (методы Application, Info, Session и т.д.), которое вызывается непосредственно после того, как это кэш будет записан на диск при выходе. Точно так же не смогли найти место, где вставить удаление кэша перед его использованием при запуске клиента.
Можно так сделать: в методе \Classes\Application\closingDown вызывать .bat файл с отложенным запуском, в отдельном потоке. Т.е. аксапта закрывается, параллельно вызывается bat файл в отдельном потоке, который либо по тайм-ауту, либо ориентируясь на запущенный процесс ax32.exe, вызывает удаление файлов кэша. Батник можно либо подготовить как статический, но лучше генерить на лету, передавай туда PID процесса клиента. Вызов консольного черного окошка можно скрыть, если вызов делать через .net сборки (createProcess), переадресовав streamOutput. Не самое красивое решение, но должно работать надежно. |
|
![]() |
#8 |
Участник
|
Цитата:
Сообщение от Bega
![]() Никто не сталкивался с такой проблемой?: очищаем кэш, пользователь закрывает приложение, запускает снова и получает ошибку:
Вложение 6628 Чаще всего это происходит на Windows 7 но также бывает и на XP. Опытным путем выяснили, что ошибка возникает после SysFlushAOD::main(null), а именно после SysFlushAOD::doFlush() внутри main(). Лечится это только ручным удалением кэша с диска. Версия DAX2009 SP1 RU6.
__________________
Ivanhoe as is.. |
|
![]() |
#9 |
Участник
|
|
|
![]() |
#10 |
Участник
|
Цитата:
Сообщение от Bega
![]() Никто не сталкивался с такой проблемой?: очищаем кэш, пользователь закрывает приложение, запускает снова и получает ошибку:
Вложение 6628 Чаще всего это происходит на Windows 7 но также бывает и на XP. Опытным путем выяснили, что ошибка возникает после SysFlushAOD::main(null), а именно после SysFlushAOD::doFlush() внутри main(). Лечится это только ручным удалением кэша с диска. Версия DAX2009 SP1 RU6. При этом если очистка кеш-а приложения происходит при старте клиента и вместе с этим удаляется и файловый кеш - при следующем старте клиента Аксапта ошибки не будет. Если Очистка кеш-а приложения произошла во уже во время работы - то при следующем старте клиента Аксапта ошибка появится, и клиент все же "свалится", но при повторном запуске все запустится без проблем! Предлагаю такое решение. 1. в методе очистки кеш-а приложения пользователю устанавливать некий флаг, который сохранит в БД информацию о том что при следующем старте клиента для данного пользователя требуется очистка файлового кеш-а, пример псевдокода X++: static client void refreshApplication() { ; global::setFlagUserClearFileCache(true); // Установить Флаг xSession::removeAOC(); SysTreeNode::refreshAll(); SysFlushDictionary::main(null); SysFlushAOD::main(null); SysFlushData::main(null); xSession::updateAOC(); global::deleteLocalCacheFiles(); // Удалить файловый кеш } X++: void startupPost() { ; if (clientKind() == ClientType::Client) { if (global::setFlagUserClearFileCache() == true) { global::deleteLocalCacheFiles(); // Удалить файловый кеш global::setFlagUserClearFileCache(false); // Сбросить флаг } ... X++: static client void deleteLocalCacheFiles() { str path; ; path = global::getPathLocalApplicationData(); WinApi::shellExecute('cmd', '/c DEL "' + path + '*.kti" /q', '', 'Open', 0); WinApi::shellExecute('cmd', '/c DEL "' + path + '*.dat" /q', '', 'Open', 0); WinApi::shellExecute('cmd', '/c DEL "' + path + '*.auc" /q', '', 'Open', 0); } X++: static client str getPathLocalApplicationData() { // опрделить местоположение папки // c:\Documents and Settings\***user***\Local Settings\Application Data\ для XP server 2003 и т.д. // c:\Users\***user***\AppData\Local\ для windows 7, server 2008 и т.д. #define.Environment_SpecialFolder_LocalApplicationData(28) str ret; System.Type type; System.Reflection.MethodInfo methodGetFolderPath; System.Object[] params; ; type = System.Type::GetType("System.Environment"); methodGetFolderPath = type.GetMethod("GetFolderPath"); params = new System.Object[1](); params.SetValue(#Environment_SpecialFolder_LocalApplicationData, 0); ret = methodGetFolderPath.Invoke(ClrInterop::Null("System.Object"), params); ret += "\\"; return ret; } Код приведенный выше, написан для Ax2009 собственно как и проблема, которая имеет место только в Аx2009 как я понял... |
|
|
За это сообщение автора поблагодарили: Bega (5), Eohaid Bress mac Elatha (1). |
Теги |
aoc, ax2009, активные пользователи, законченный пример, кэш, полезное |
|
Опции темы | Поиск в этой теме |
Опции просмотра | |
|