Показать сообщение отдельно
Старый 18.10.2012, 19:32   #41  
someOne is offline
someOne
Участник
Аватар для someOne
 
174 / 432 (15) +++++++
Регистрация: 11.12.2008
Адрес: Москва
Цитата:
Сообщение от 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 как я понял...
За это сообщение автора поблагодарили: Bega (5), Eohaid Bress mac Elatha (1).