Цитата:
Сообщение от
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(); // Удалить файловый кеш
}
2. В методе Application.startupPost() произвети проверку флага пользователя и очистку файлового кеш-а при необходимости
X++:
void startupPost()
{
;
if (clientKind() == ClientType::Client)
{
if (global::setFlagUserClearFileCache() == true)
{
global::deleteLocalCacheFiles(); // Удалить файловый кеш
global::setFlagUserClearFileCache(false); // Сбросить флаг
}
...
Пример кода метода deleteLocalCacheFiles :
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);
}
В нем в свою очередь используется другой метод getPathLocalApplicationData
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;
}
Код метода global::setFlagUserClearFileCache приводить не буду - там возможно множество разных способов реализации - главная идея - сохранить, прочитать и удалить некий признак для текущего пользователя в базе данных Аксапты.
Код приведенный выше, написан для Ax2009 собственно как и проблема, которая имеет место только в Аx2009 как я понял...