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,436 / 1775 (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 его ловит дальше по коду
Старый 04.09.2012, 14:20   #4  
lvan is offline
lvan
Участник
Аватар для lvan
Лучший по профессии 2014
 
858 / 82 (4) ++++
Регистрация: 15.04.2011
Записей в блоге: 1
Я бы смотрел в сторону убийства процесса AX32.exe, например через те же winapi функции
Интересно узнать, зачем вам это понадобилось?
Старый 04.09.2012, 14:34   #5  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Зачем сразу убийства?.. ExitProcess()
За это сообщение автора поблагодарили: f18 (2).
Старый 04.09.2012, 14:57   #6  
f18 is offline
f18
Участник
Аватар для f18
Дети Юза
 
188 / 101 (4) +++++
Регистрация: 09.08.2005
lvan
Я бы смотрел в сторону убийства процесса AX32.exe, например через те же winapi функции

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


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

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


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

>> Спасибо - попробую, отпишусь.
Старый 04.09.2012, 15:27   #7  
f18 is offline
f18
Участник
Аватар для f18
Дети Юза
 
188 / 101 (4) +++++
Регистрация: 09.08.2005
Цитата:
Сообщение от gl00mie Посмотреть сообщение
Зачем сразу убийства?.. ExitProcess()
Работает великолепно (а главное оч быстро)!
Спасибо большое!
Старый 04.09.2012, 15:51   #8  
michel1971 is offline
michel1971
Участник
 
77 / 78 (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   #9  
f18 is offline
f18
Участник
Аватар для f18
Дети Юза
 
188 / 101 (4) +++++
Регистрация: 09.08.2005
Если не сложно, для людей не сильно понимающих разницу - в чем принципиальная разница?
Старый 04.09.2012, 16:26   #10  
michel1971 is offline
michel1971
Участник
 
77 / 78 (3) ++++
Регистрация: 14.01.2011
Цитата:
Сообщение от f18 Посмотреть сообщение
Если не сложно, для людей не сильно понимающих разницу - в чем принципиальная разница?
видимо из-за этого: "Функцию TerminateProcess следует использовать только в исключительных случаях, когда исчерпаны все другие способы воздействия на процесс, поскольку она не позволяет потокам процесса выполнить очистку или сохранить данные, а также не оповещает загруженные DLL о завершении процесса."
За это сообщение автора поблагодарили: f18 (1).
Старый 04.09.2012, 16:40   #11  
f18 is offline
f18
Участник
Аватар для f18
Дети Юза
 
188 / 101 (4) +++++
Регистрация: 09.08.2005
Цитата:
Сообщение от michel1971 Посмотреть сообщение
видимо из-за этого: "Функцию TerminateProcess следует использовать только в исключительных случаях, когда исчерпаны все другие способы воздействия на процесс, поскольку она не позволяет потокам процесса выполнить очистку или сохранить данные, а также не оповещает загруженные DLL о завершении процесса."
Ок, спс! Если у меня аксапта работает след образом
Преднастроенный терминальный клиент с автозапуском аксапты, если аксапта закрывается - закрывается терминальный клиент. Правильно ли я понимаю, что используя TerminateProcess и, как следствие, выход из терминальной сессии, я гарантирую коректность закрытия dll?
Старый 04.09.2012, 17:53   #12  
michel1971 is offline
michel1971
Участник
 
77 / 78 (3) ++++
Регистрация: 14.01.2011
Цитата:
Сообщение от f18 Посмотреть сообщение
Ок, спс! Если у меня аксапта работает след образом
Преднастроенный терминальный клиент с автозапуском аксапты, если аксапта закрывается - закрывается терминальный клиент.
а что есть такие настройки? Про автозапуск понятно, а вот про закрытие первый раз слышу.
Цитата:
Сообщение от f18 Посмотреть сообщение
Правильно ли я понимаю, что используя TerminateProcess и, как следствие, выход из терминальной сессии, я гарантирую коректность закрытия dll?
мне кажется что у меня написано ровно противоположное
Старый 04.09.2012, 18:15   #13  
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.
Старый 04.09.2012, 18:16   #14  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от f18 Посмотреть сообщение
Ок, спс! Если у меня аксапта работает след образом
Преднастроенный терминальный клиент с автозапуском аксапты, если аксапта закрывается - закрывается терминальный клиент. Правильно ли я понимаю, что используя TerminateProcess и, как следствие, выход из терминальной сессии, я гарантирую коректность закрытия dll?
ужас-ужас-ужас!!!
Старый 04.09.2012, 18:45   #15  
EVGL is offline
EVGL
Banned
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
4,445 / 3001 (0) ++++++++++
Регистрация: 09.07.2002
Адрес: Parndorf, AT
А что? Зависание системы в seamless-терминальном окне - это действительно серьезная проблема.
Старый 04.09.2012, 21:57   #16  
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, 01:10   #17  
f18 is offline
f18
Участник
Аватар для f18
Дети Юза
 
188 / 101 (4) +++++
Регистрация: 09.08.2005
Цитата:
Сообщение от michel1971 Посмотреть сообщение
а что есть такие настройки? Про автозапуск понятно, а вот про закрытие первый раз слышу.
Если прописать Подключение к удаленному рабочему столу\Закладка программы\Автозапуск программы, то при закрытии запущеной программы закрывается система.
Старый 05.09.2012, 01:25   #18  
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, 01:41   #19  
f18 is offline
f18
Участник
Аватар для f18
Дети Юза
 
188 / 101 (4) +++++
Регистрация: 09.08.2005
Цитата:
Сообщение от mazzy Посмотреть сообщение
ужас-ужас-ужас!!!
извините, не понял. Можете или объяснить свою позицию или направить на ресурс в котором обьясняется почему это ужас?
Старый 05.09.2012, 02:10   #20  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от f18 Посмотреть сообщение
извините, не понял. Можете или объяснить свою позицию или направить на ресурс в котором обьясняется почему это ужас?
Цитата:
Сообщение от f18 Посмотреть сообщение
используя TerminateProcess и, как следствие, выход из терминальной сессии, я гарантирую коректность закрытия dll?
с одной стороны, глупых вопросов не бывает - глупыми бывают только ответы.
с другой стороны, сама мысль о том, что TerminateProcess можно использовать в ERP-системе... Причем использовать, чтобы гарантировать корректность... Она отдает такой степенью извращенности, в которую страшно заглянуть.

Поэтому и ужас-ужас-ужас
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Как сильно модифицировано ваше приложение Аксапты? 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, время: 15:28.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.