AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 04.09.2012, 12:58   #1  
f18 is offline
f18
Участник
Аватар для f18
Дети Юза
 
188 / 101 (4) +++++
Регистрация: 09.08.2005
как выйти из аксапты в строго заданном месте?
Здравствуйте.
Есть задача - при наступлении определенного условия, неважно на каком этапе обработки мы находимся - срочно покинуть аксапту (с обрыванием всех транзакций, с несохранением введенных данных) - просто выйти. Естественно подумал использовать infolog.shutDown(true), не сработало, отсюда 2 вопроса - один на забавный, второй серьезный
1.
Сколько раз отработает цикл
X++:
    int i;
    for (i = 1; i <= 1000; i++)
    {
        print i;
        infolog.shutDown(true);
    }
2. как завершить работу приложения.
// WinAPI::exitWindows(#EWX_FORCE) - пробовал - получилось грустно и все равно цикл отработал 1000 раз

Спасибо.

Ax2009
Старый 04.09.2012, 13:07   #2  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,427 / 1771 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Сгенерируйте исключение сразу после вызова infolog.shutDown(true);
Старый 04.09.2012, 13:13   #3  
f18 is offline
f18
Участник
Аватар для f18
Дети Юза
 
188 / 101 (4) +++++
Регистрация: 09.08.2005
try его ловит дальше по коду
Старый 08.10.2020, 14:41   #4  
Perc is offline
Perc
Участник
 
193 / 44 (2) +++
Регистрация: 05.03.2005
Цитата:
Сообщение от f18 Посмотреть сообщение
try его ловит дальше по коду
А если сгенерировать то что try не ловит? типа
X++:
    infolog.shutDown(true);
    new DictClass(ClassNum(Info)).callStatic("mmm");
Правда тогда еще у пользователя не должно быть прав админских, либо режим отладка выключен...
Старый 04.09.2012, 14:20   #5  
lvan is offline
lvan
Участник
Аватар для lvan
Лучший по профессии 2014
 
856 / 82 (4) ++++
Регистрация: 15.04.2011
Записей в блоге: 1
Я бы смотрел в сторону убийства процесса AX32.exe, например через те же winapi функции
Интересно узнать, зачем вам это понадобилось?
Старый 04.09.2012, 14:34   #6  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5788 (200) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Зачем сразу убийства?.. ExitProcess()
За это сообщение автора поблагодарили: f18 (2).
Старый 04.09.2012, 14:57   #7  
f18 is offline
f18
Участник
Аватар для f18
Дети Юза
 
188 / 101 (4) +++++
Регистрация: 09.08.2005
lvan
Я бы смотрел в сторону убийства процесса AX32.exe, например через те же winapi функции

>> не знал функци, поэтому и спросил :-)


Интересно узнать, зачем вам это понадобилось?

>> это сложно. Очень грубо говоря багфиксинг.


gl00mie Зачем сразу убийства?.. ExitProcess()

>> Спасибо - попробую, отпишусь.
Старый 04.09.2012, 15:27   #8  
f18 is offline
f18
Участник
Аватар для f18
Дети Юза
 
188 / 101 (4) +++++
Регистрация: 09.08.2005
Цитата:
Сообщение от gl00mie Посмотреть сообщение
Зачем сразу убийства?.. ExitProcess()
Работает великолепно (а главное оч быстро)!
Спасибо большое!
Старый 04.09.2012, 15:51   #9  
michel1971 is offline
michel1971
Участник
 
76 / 63 (3) ++++
Регистрация: 14.01.2011
определяем ID процесса
X++:
static int GetCurrentProcessId()
{
    Dll             kernel32          = new Dll(#KERNELDLL);
    DllFunction     processId         = new DllFunction(kernel32, "GetCurrentProcessId");
    ;
    processId.returns(ExtTypes:: DWord);

    return processId.call();
}
затем убиваем его
X++:
static void TerminateProcess(int    _processId)
{
    Dll             kernel32            = new Dll(#KERNELDLL);
    DllFunction     closeHandle         = new DllFunction(kernel32, "CloseHandle");
    DllFunction     terminateProcess    = new DllFunction(kernel32, "TerminateProcess");
    DllFunction     openProcess         = new DllFunction(kernel32, "OpenProcess");

    int             hProcess;

    closeHandle.returns(ExtTypes:: DWORD);
    closeHandle.arg(ExtTypes:: DWORD);

    terminateProcess.returns(ExtTypes:: DWord);
    terminateProcess.arg(ExtTypes:: DWord, ExtTypes:: DWord);

    openProcess.returns(ExtTypes:: DWord);
    openProcess.arg(ExtTypes:: DWord, ExtTypes::DWord, ExtTypes:: DWord);

    hProcess = openProcess.call(1, false, _processId);

    terminateProcess.call(hProcess, 1);

    closeHandle.call(hProcess);
}
Старый 04.09.2012, 16:11   #10  
f18 is offline
f18
Участник
Аватар для f18
Дети Юза
 
188 / 101 (4) +++++
Регистрация: 09.08.2005
Если не сложно, для людей не сильно понимающих разницу - в чем принципиальная разница?
Старый 04.09.2012, 18:15   #11  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от f18 Посмотреть сообщение
Сколько раз отработает цикл
X++:
    int i;
    for (i = 1; i <= 1000; i++)
    {
        print i;
        infolog.shutDown(true);
    }
2. как завершить работу приложения.
// WinAPI::exitWindows(#EWX_FORCE) - пробовал - получилось грустно и все равно цикл отработал 1000 раз
Цикл отработает 1000 раз.

infolog.shutDown(true) всего лишь информирует систему, что Аксапту нужно закрыть когда будет возможность. Аксапта выйдет, когда перейдет в режим ожидания.
Пока выполняется код выхода из системы не будет.

Не заставляйте выходить из аксапты принудительно.
Разбейте задачу на две части:
1. проинфорируйте систему что вы ее хотите закрыть.
2. заставьте ваш код завершить выполнение

чтобы заставить ваш код завершить выполнение, не надо ломать dll'ки. достаточно обычных break и return.
Старый 05.09.2012, 01:25   #12  
f18 is offline
f18
Участник
Аватар для f18
Дети Юза
 
188 / 101 (4) +++++
Регистрация: 09.08.2005
Цитата:
Сообщение от mazzy Посмотреть сообщение
Цикл отработает 1000 раз.

infolog.shutDown(true) всего лишь информирует систему, что Аксапту нужно закрыть когда будет возможность. Аксапта выйдет, когда перейдет в режим ожидания.
Пока выполняется код выхода из системы не будет.

Не заставляйте выходить из аксапты принудительно.
Разбейте задачу на две части:
1. проинфорируйте систему что вы ее хотите закрыть.
2. заставьте ваш код завершить выполнение

чтобы заставить ваш код завершить выполнение, не надо ломать dll'ки. достаточно обычных break и return.
речь идет о трудно вычислимом баге, и попытке его поймать. То что это концептуально неправильно ясно, но все равно спасибо за дополнительное целенаведение.

Стоит делема - остановить пользователей из за иногда возникающей проблемы генерирующей по 4,5 млн записей в лог за 240 минут (а на лог еще и умудрились повесить генератор оповещений, да еще и не один пользователь т.е. 4,5 млн * кол-во пользователей, а потом еще и невозможность открыть аксапту при логине пользователей), или, до выяснения, в своем коде, гарантированно без транзакций при возникновении подозрения на бестактное поведение - просто закрывать аксапту.
Да, это не красиво, да может быть прощет в архитектуре и лога и поведении системы, но для того что бы работа не остановилась и было время на корректное исправление и приведения системы с break и return - нужно время и ... вот такая заплатка.
Старый 05.09.2012, 09:37   #13  
raz is offline
raz
NavAx
Аватар для raz
NavAx Club
Лучший по профессии 2014
Лучший по профессии 2009
 
1,490 / 1060 (38) ++++++++
Регистрация: 22.07.2003
Адрес: МО
Цитата:
Сообщение от f18 Посмотреть сообщение
речь идет о трудно вычислимом баге, и попытке его поймать. То что это концептуально неправильно ясно, но все равно спасибо за дополнительное целенаведение.

Стоит делема - остановить пользователей из за иногда возникающей проблемы генерирующей по 4,5 млн записей в лог за 240 минут (а на лог еще и умудрились повесить генератор оповещений, да еще и не один пользователь т.е. 4,5 млн * кол-во пользователей, а потом еще и невозможность открыть аксапту при логине пользователей), или, до выяснения, в своем коде, гарантированно без транзакций при возникновении подозрения на бестактное поведение - просто закрывать аксапту.
Да, это не красиво, да может быть прощет в архитектуре и лога и поведении системы, но для того что бы работа не остановилась и было время на корректное исправление и приведения системы с break и return - нужно время и ... вот такая заплатка.
А если попытаться найти причину?
Статус "Отменено" в строках заказа
Старый 05.09.2012, 13:37   #14  
f18 is offline
f18
Участник
Аватар для f18
Дети Юза
 
188 / 101 (4) +++++
Регистрация: 09.08.2005
Цитата:
Сообщение от raz Посмотреть сообщение
А если попытаться найти причину?
Статус "Отменено" в строках заказа
Буду рад если поможете.

Итак что есть ...

Есть некая логика
Класс TSession - хранит в себе информацию о неком пользователе системы, ссылку на TProcess, ссылку на TFormUpdater

TProcess - класс выполняющий некую работу в системе, в зависимости от введенной пользователем информации. TFormUpdater обновляется классом TProcess и его заддача хранить текущие переменные для отображения на экране. Логика создавалась не для форм аксапты, но жизнь такова, что есть формы работающие с этими классами и в аксапте - прикреплены примеры форм.
На форме только одно окно (СтрингЭдит) для ввода информации. Задачи этого контролла - после нажатия пользователем энтера передать эту информацию в TSession (допустим метод ВВОД) , очистится и перечитать в свои объекты на форме состояние измененного TFormUpdater. TSession вызывает метод ВВОД класса TProcess. В TProcess.ВВОД стоит try catch и если происходит исключительное состояние - запонить инфолог в некий лог, что бы пользователь мог его прочитать.
Теперь форма в аксапте. СтрингЭдит - исходя из задач кот перед ним стоят - реализован в виде эдит метода с кодом (набираю руками - могу ошибится)

X++:
edit str (boolean _set, str _value)
{
    if (set)
    {
        TSession.(_value);
    }
    return "";
}
Что произошло - в лог записалось много записей, почему?
Как вариант - пользователь ввел какое-то значение в СтрингЭдит, нажал на форме эскейп, форма спросила - Я Изменилась, сохранить незаписаннные данные - а пользователь нажал - сохранить ...

Возможные направления исправления ошибки - отказаться от эдит метода и отрабатывать просто модифай + попросить форму не заадавать вопроса, но здесь сложнее, обработка многошаговая, есть шаги когда вопрос просто необходимо задавать.
Трай в эдит методе не могу делать - большая обработка инфолога + не факт что такое же можно будет сделать в форме не аксапты. Пока до форм не аксапты не добрались - и ошибку не пофиксили было принято решение пользователям продолжать работать в системе, уведомить что бы все отказывались от всего предлагаемого + жуть-жуть-жжжжжуть.
Миниатюры
Нажмите на изображение для увеличения
Название: IMG143.jpg
Просмотров: 107
Размер:	242.0 Кб
ID:	7864   Нажмите на изображение для увеличения
Название: IMG144.jpg
Просмотров: 126
Размер:	248.7 Кб
ID:	7865  

Старый 05.09.2012, 14:29   #15  
raz is offline
raz
NavAx
Аватар для raz
NavAx Club
Лучший по профессии 2014
Лучший по профессии 2009
 
1,490 / 1060 (38) ++++++++
Регистрация: 22.07.2003
Адрес: МО
Цитата:
Сообщение от f18 Посмотреть сообщение
Что произошло - в лог записалось много записей, почему?
Если я правильно понимаю, то лог - это некий доработанный лог, не SysDataBaseLog аксапты, причем это таблица.
Если я прав, то можно настоить журнал базы данных на эту таблицу, и, после повторения проблемы, проанализировать стек вызовов.
Старый 04.09.2012, 18:45   #16  
EVGL is offline
EVGL
Banned
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
4,445 / 3001 (0) ++++++++++
Регистрация: 09.07.2002
Адрес: Parndorf, AT
А что? Зависание системы в seamless-терминальном окне - это действительно серьезная проблема.
Старый 04.09.2012, 21:57   #17  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от EVGL Посмотреть сообщение
А что? Зависание системы в seamless-терминальном окне - это действительно серьезная проблема.
ну, не так же бороться с такими зависами.
вызывать sysprogressinfo, вставлять sleep, отдавать управление аксапте через task, обращаться к wait формы... хоть это и неправильно, но лучше чем принудительное убивание dll'ек изнутри самой программы.

и еще.
стоит четко различать состояния когда:
1. поток кода выполняется в самой аксапте (как в этой теме пример с циклом и тут надо тупо юзать break/return чтобы завершить свой код) и
2. аксапта ждет ответа от SQL-сервера

например, массовый апдейт по многоГиговой таблице с огромной вероятностью заблокирует всех на несколько минут. любое прерывание не приведет к немедленному отвисанию и снятию блокировки (даже если аксапту убить), ведь SQL-сервер начнет откатывать транзакцию - еще несколько минут.

поэтому задача программиста - корректно завершить выполнение своего кода и уведомить систему, что нужно выйти в винду.
Старый 05.09.2012, 14:47   #18  
raz is offline
raz
NavAx
Аватар для raz
NavAx Club
Лучший по профессии 2014
Лучший по профессии 2009
 
1,490 / 1060 (38) ++++++++
Регистрация: 22.07.2003
Адрес: МО
Ну жжжуткий фикс наверно стоит оставить, до нахождения причин. Ну и не факт, что стек поможет. Кстати, стек можно и добавить в TLog (если что), а может и еще чего туда писать (значения переменных...) для последующего анализа.
Старый 05.09.2012, 14:51   #19  
f18 is offline
f18
Участник
Аватар для f18
Дети Юза
 
188 / 101 (4) +++++
Регистрация: 09.08.2005
Цитата:
Сообщение от raz Посмотреть сообщение
Ну жжжуткий фикс наверно стоит оставить, до нахождения причин. Ну и не факт, что стек поможет. Кстати, стек можно и добавить в TLog (если что), а может и еще чего туда писать (значения переменных...) для последующего анализа.
не додумал, тогда и журнал бд не нужен. Спасибо.
Старый 08.10.2020, 15:51   #20  
Pandasama is offline
Pandasama
Участник
 
448 / 133 (5) +++++
Регистрация: 11.08.2014
Адрес: Барнаул
лови некроманта!
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Как сильно модифицировано ваше приложение Аксапты? mazzy DAX: Прочие вопросы 30 14.04.2011 17:26
Вставка строк в таблицы Аксапты сторонними средствами Андре DAX: База знаний и проекты 1 07.05.2009 16:49
Программный запуск Аксапты из Аксапты DreamCreator DAX: Программирование 11 04.05.2009 10:05
Экспорт / импорт Help topics и запуск второй сессии Аксапты из-под себя DmitrySt DAX: Программирование 0 25.11.2004 00:22
Реальный сетевой трафик Аксапты Seismic DAX: Прочие вопросы 12 21.11.2003 12:06
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 07:43.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.