AXForum  
Go Back   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Forgotten Your Password?
Register Forum Rules FAQ Members List Today's Posts Search

 
 
Thread Tools Search this Thread Display Modes
Old 04.09.2012, 12:58   #1  
f18 is offline
f18
Участник
f18's Avatar
Дети Юза
 
188 / 101 (4) +++++
Join Date: 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
Old 04.09.2012, 13:07   #2  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,448 / 1792 (66) ++++++++
Join Date: 28.04.2007
Location: Калуга
Сгенерируйте исключение сразу после вызова infolog.shutDown(true);
Old 04.09.2012, 13:13   #3  
f18 is offline
f18
Участник
f18's Avatar
Дети Юза
 
188 / 101 (4) +++++
Join Date: 09.08.2005
try его ловит дальше по коду
Old 04.09.2012, 14:20   #4  
lvan is offline
lvan
Участник
lvan's Avatar
Лучший по профессии 2014
 
858 / 82 (4) ++++
Join Date: 15.04.2011
Blog Entries: 1
Я бы смотрел в сторону убийства процесса AX32.exe, например через те же winapi функции
Интересно узнать, зачем вам это понадобилось?
Old 04.09.2012, 14:34   #5  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5813 (201) ++++++++++
Join Date: 28.11.2005
Location: Москва
Blog Entries: 3
Зачем сразу убийства?.. ExitProcess()
This post has been rated by: f18 (2).
Old 04.09.2012, 14:57   #6  
f18 is offline
f18
Участник
f18's Avatar
Дети Юза
 
188 / 101 (4) +++++
Join Date: 09.08.2005
lvan
Я бы смотрел в сторону убийства процесса AX32.exe, например через те же winapi функции

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


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

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


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

>> Спасибо - попробую, отпишусь.
Old 04.09.2012, 15:27   #7  
f18 is offline
f18
Участник
f18's Avatar
Дети Юза
 
188 / 101 (4) +++++
Join Date: 09.08.2005
Quote:
Originally Posted by gl00mie View Post
Зачем сразу убийства?.. ExitProcess()
Работает великолепно (а главное оч быстро)!
Спасибо большое!
Old 04.09.2012, 15:51   #8  
michel1971 is offline
michel1971
Участник
 
79 / 80 (3) ++++
Join Date: 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);
}
Old 04.09.2012, 16:11   #9  
f18 is offline
f18
Участник
f18's Avatar
Дети Юза
 
188 / 101 (4) +++++
Join Date: 09.08.2005
Если не сложно, для людей не сильно понимающих разницу - в чем принципиальная разница?
Old 04.09.2012, 16:26   #10  
michel1971 is offline
michel1971
Участник
 
79 / 80 (3) ++++
Join Date: 14.01.2011
Quote:
Originally Posted by f18 View Post
Если не сложно, для людей не сильно понимающих разницу - в чем принципиальная разница?
видимо из-за этого: "Функцию TerminateProcess следует использовать только в исключительных случаях, когда исчерпаны все другие способы воздействия на процесс, поскольку она не позволяет потокам процесса выполнить очистку или сохранить данные, а также не оповещает загруженные DLL о завершении процесса."
This post has been rated by: f18 (1).
Old 04.09.2012, 16:40   #11  
f18 is offline
f18
Участник
f18's Avatar
Дети Юза
 
188 / 101 (4) +++++
Join Date: 09.08.2005
Quote:
Originally Posted by michel1971 View Post
видимо из-за этого: "Функцию TerminateProcess следует использовать только в исключительных случаях, когда исчерпаны все другие способы воздействия на процесс, поскольку она не позволяет потокам процесса выполнить очистку или сохранить данные, а также не оповещает загруженные DLL о завершении процесса."
Ок, спс! Если у меня аксапта работает след образом
Преднастроенный терминальный клиент с автозапуском аксапты, если аксапта закрывается - закрывается терминальный клиент. Правильно ли я понимаю, что используя TerminateProcess и, как следствие, выход из терминальной сессии, я гарантирую коректность закрытия dll?
Old 04.09.2012, 17:53   #12  
michel1971 is offline
michel1971
Участник
 
79 / 80 (3) ++++
Join Date: 14.01.2011
Quote:
Originally Posted by f18 View Post
Ок, спс! Если у меня аксапта работает след образом
Преднастроенный терминальный клиент с автозапуском аксапты, если аксапта закрывается - закрывается терминальный клиент.
а что есть такие настройки? Про автозапуск понятно, а вот про закрытие первый раз слышу.
Quote:
Originally Posted by f18 View Post
Правильно ли я понимаю, что используя TerminateProcess и, как следствие, выход из терминальной сессии, я гарантирую коректность закрытия dll?
мне кажется что у меня написано ровно противоположное
Old 04.09.2012, 18:15   #13  
mazzy is offline
mazzy
Участник
mazzy's Avatar
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Join Date: 29.11.2001
Location: Москва
Blog Entries: 10
Quote:
Originally Posted by f18 View Post
Сколько раз отработает цикл
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.
Old 04.09.2012, 18:16   #14  
mazzy is offline
mazzy
Участник
mazzy's Avatar
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Join Date: 29.11.2001
Location: Москва
Blog Entries: 10
Quote:
Originally Posted by f18 View Post
Ок, спс! Если у меня аксапта работает след образом
Преднастроенный терминальный клиент с автозапуском аксапты, если аксапта закрывается - закрывается терминальный клиент. Правильно ли я понимаю, что используя TerminateProcess и, как следствие, выход из терминальной сессии, я гарантирую коректность закрытия dll?
ужас-ужас-ужас!!!
Old 04.09.2012, 18:45   #15  
EVGL is offline
EVGL
Banned
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
4,445 / 3001 (0) ++++++++++
Join Date: 09.07.2002
Location: Parndorf, AT
А что? Зависание системы в seamless-терминальном окне - это действительно серьезная проблема.
Old 04.09.2012, 21:57   #16  
mazzy is offline
mazzy
Участник
mazzy's Avatar
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Join Date: 29.11.2001
Location: Москва
Blog Entries: 10
Quote:
Originally Posted by EVGL View Post
А что? Зависание системы в seamless-терминальном окне - это действительно серьезная проблема.
ну, не так же бороться с такими зависами.
вызывать sysprogressinfo, вставлять sleep, отдавать управление аксапте через task, обращаться к wait формы... хоть это и неправильно, но лучше чем принудительное убивание dll'ек изнутри самой программы.

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

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

поэтому задача программиста - корректно завершить выполнение своего кода и уведомить систему, что нужно выйти в винду.
Old 05.09.2012, 01:10   #17  
f18 is offline
f18
Участник
f18's Avatar
Дети Юза
 
188 / 101 (4) +++++
Join Date: 09.08.2005
Quote:
Originally Posted by michel1971 View Post
а что есть такие настройки? Про автозапуск понятно, а вот про закрытие первый раз слышу.
Если прописать Подключение к удаленному рабочему столу\Закладка программы\Автозапуск программы, то при закрытии запущеной программы закрывается система.
Old 05.09.2012, 01:25   #18  
f18 is offline
f18
Участник
f18's Avatar
Дети Юза
 
188 / 101 (4) +++++
Join Date: 09.08.2005
Quote:
Originally Posted by mazzy View Post
Цикл отработает 1000 раз.

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

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

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

Стоит делема - остановить пользователей из за иногда возникающей проблемы генерирующей по 4,5 млн записей в лог за 240 минут (а на лог еще и умудрились повесить генератор оповещений, да еще и не один пользователь т.е. 4,5 млн * кол-во пользователей, а потом еще и невозможность открыть аксапту при логине пользователей), или, до выяснения, в своем коде, гарантированно без транзакций при возникновении подозрения на бестактное поведение - просто закрывать аксапту.
Да, это не красиво, да может быть прощет в архитектуре и лога и поведении системы, но для того что бы работа не остановилась и было время на корректное исправление и приведения системы с break и return - нужно время и ... вот такая заплатка.
Old 05.09.2012, 01:41   #19  
f18 is offline
f18
Участник
f18's Avatar
Дети Юза
 
188 / 101 (4) +++++
Join Date: 09.08.2005
Quote:
Originally Posted by mazzy View Post
ужас-ужас-ужас!!!
извините, не понял. Можете или объяснить свою позицию или направить на ресурс в котором обьясняется почему это ужас?
Old 05.09.2012, 02:10   #20  
mazzy is offline
mazzy
Участник
mazzy's Avatar
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Join Date: 29.11.2001
Location: Москва
Blog Entries: 10
Quote:
Originally Posted by f18 View Post
извините, не понял. Можете или объяснить свою позицию или направить на ресурс в котором обьясняется почему это ужас?
Quote:
Originally Posted by f18 View Post
используя TerminateProcess и, как следствие, выход из терминальной сессии, я гарантирую коректность закрытия dll?
с одной стороны, глупых вопросов не бывает - глупыми бывают только ответы.
с другой стороны, сама мысль о том, что TerminateProcess можно использовать в ERP-системе... Причем использовать, чтобы гарантировать корректность... Она отдает такой степенью извращенности, в которую страшно заглянуть.

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

Similar Threads
Thread Thread Starter Forum Replies Last Post
Как сильно модифицировано ваше приложение Аксапты? 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

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Forum Jump

Рейтинг@Mail.ru
All times are GMT +3. The time now is 15:39.
Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Contacts E-mail, Advertising.