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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 22.10.2008, 15:23   #1  
CDR is offline
CDR
MCTS
MCBMSS
 
236 / 175 (6) ++++++
Регистрация: 27.11.2003
! Крэш DAX 4.0 / DAX 2009
Всем привет!
При переносе решения с DAX3.0 на DAX4.0 / DAX2009 столкнулся со следующей непонятной ситуацией: код, прекрасно отрабатывающий в трешке, в новых версиях приводит к крэшу системы .

Код связан с программным созданием формы при нажатии на кнопку посредством classFactory.formRunClass().

X++:
public class FormRun extends ObjectRun
{
    FormRun     formRun;
}

void clicked()
{
    super();
    element.TestError();
}

void TestError()
{
    Args            args;
    ;

    if (formRun)
    {
        formRun.close();
    }

    args = new Args();
    args.name(formstr(InventTable));
    args.caller(this);

    formRun = classFactory.formRunClass(args);
    formRun.init();
    formRun.run();
    formRun.wait();
}
При нажатии на кнопку первый и второй раз (не закрывая открывшуюся форму InventTable) все отрабатывает успешно, на третий раз получем крэш системы.

Соответственно вопрос: это новый баг? новая фича? или это только у меня подобное?

Во вложении два проекта: для 3.0 и 4.0 соответственно.
Вложения
Тип файла: xpo TestErrorForm_30.xpo (4.8 Кб, 366 просмотров)
Тип файла: xpo TestErrorForm_40.xpo (1.8 Кб, 414 просмотров)
__________________
Dynamics AX Experience

Последний раз редактировалось CDR; 22.10.2008 в 15:26.
За это сообщение автора поблагодарили: kashperuk (5).
Старый 22.10.2008, 15:51   #2  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Похоже на баг.
Попробую подтвердить/опровергнуть это в ближайшее время.
Также возможно workaround какой-то придумаем.
За это сообщение автора поблагодарили: CDR (1).
Старый 22.10.2008, 16:17   #3  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Вот я сижу и думаю, а почему вы вообще используете wait(), а не detach()?

Ведь смысл Wait() состоит в том, чтобы долждаться закрытия дочерней формы перед продолжением исполнения кода родительской.

Проверил с detach() - у меня обвалов системы не наблюдается
Старый 22.10.2008, 16:30   #4  
CDR is offline
CDR
MCTS
MCBMSS
 
236 / 175 (6) ++++++
Регистрация: 27.11.2003
Цитата:
Сообщение от kashperuk Посмотреть сообщение
Вот я сижу и думаю, а почему вы вообще используете wait(), а не detach()?

Ведь смысл Wait() состоит в том, чтобы долждаться закрытия дочерней формы перед продолжением исполнения кода родительской.

Проверил с detach() - у меня обвалов системы не наблюдается
Смысл, если в кратце, в следующем...
Есть родительская форма, с нее по кнопке открывается дочерняя... При этом в родительской форме необходимо иметь возможность контролировать дочернюю форму. Пока открыта дочерняя форма, родительская форма не должна закрываться (поведение, как у диалогов на RunBaseBatch). При повторном нажатии на кнопку форму необходимо переоткрыть.... Это нужно для обновления данных в дочерней форме. Вроде ничего криминального .

Понятно, что это можно обойти и решить по другому, например сделать обновление формы без ее закрытия...

Непонятно, почему в трешке работает, в новых версиях - крэш. Это с чем-то жизненным связано или просто так сделали?
__________________
Dynamics AX Experience
Старый 22.10.2008, 16:35   #5  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Цитата:
Сообщение от kashperuk Посмотреть сообщение
Вот я сижу и думаю, а почему вы вообще используете wait(), а не detach()?
Если использовать detach(), то вообще смысл заморочек с formRun теряется - разве что оставлять ссылку на форму, чтобы закрыть ее при следующем нажатии кнопки... если не ждать завершения работы формы, то проще использовать конструкцию вида
X++:
new MenuFunction(menuitemdisplaystr(InventTable), MenuItemType::Display).run( args );
Заодно проверка прав доступа на пункте меню отработает... К слову, интересное дело: если самостоятельно закрыть форму InventTable, то в вызывающей форме соотв. formRun продолжает жить и здравствовать, и на нем можно снова вызвать close(). Не возникнет ли каких побочных эффектов при этом?..
Старый 22.10.2008, 16:45   #6  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Цитата:
Сообщение от CDR Посмотреть сообщение
Есть родительская форма, с нее по кнопке открывается дочерняя... При этом в родительской форме необходимо иметь возможность контролировать дочернюю форму.
Контролировать каким образом? Заметьте, что пользователь может закрыть дочернюю форму, и, если она в методе close() как-то не информирует об этом форму родительскую, то та об этом и не узнает - объект FormRun дочерней формы будет все также спокойно жить в контексте формы родительской. Организуйте как-либо взаимодействие этих форм, например, как это сделано в журналах и строках журналов.
Цитата:
Сообщение от CDR Посмотреть сообщение
Пока открыта дочерняя форма, родительская форма не должна закрываться (поведение, как у диалогов на RunBaseBatch).
Подумайте об организации псевдомодальности.
Цитата:
Сообщение от CDR Посмотреть сообщение
При повторном нажатии на кнопку форму необходимо переоткрыть... Это нужно для обновления данных в дочерней форме. Понятно, что это можно обойти и решить по другому, например сделать обновление формы без ее закрытия...
Конечно, можно - через dynalink'и и обработку linkActive() на DS дочерней формы или напрямую через вызов ее методов из родительской формы...
Старый 22.10.2008, 16:47   #7  
CDR is offline
CDR
MCTS
MCBMSS
 
236 / 175 (6) ++++++
Регистрация: 27.11.2003
Цитата:
Сообщение от gl00mie Посмотреть сообщение
Если использовать detach(), то вообще смысл заморочек с formRun теряется - разве что оставлять ссылку на форму, чтобы закрыть ее при следующем нажатии кнопки... если не ждать завершения работы формы, то проще использовать конструкцию вида... Заодно проверка прав доступа на пункте меню отработает...
Ну еще, например, detach() полезен в случае программного построения дизайна формы перед ее запуском...

А вообще - да, запуск формы должен везде, где получается, быть по менюитему.

Цитата:
Сообщение от gl00mie Посмотреть сообщение
К слову, интересное дело: если самостоятельно закрыть форму InventTable, то в вызывающей форме соотв. formRun продолжает жить и здравствовать, и на нем можно снова вызвать close(). Не возникнет ли каких побочных эффектов при этом?..
Нет, ничего не происходит, хотя formRun действительно продолжает жить...
__________________
Dynamics AX Experience
Старый 22.10.2008, 17:11   #8  
CDR is offline
CDR
MCTS
MCBMSS
 
236 / 175 (6) ++++++
Регистрация: 27.11.2003
Цитата:
Сообщение от gl00mie Посмотреть сообщение
Контролировать каким образом? Заметьте, что пользователь может закрыть дочернюю форму, и, если она в методе close() как-то не информирует об этом форму родительскую, то та об этом и не узнает - объект FormRun дочерней формы будет все также спокойно жить в контексте формы родительской.
Неправильно. Родительская форма без проблем может узнать не только, закрыта ли дочерняя форма, но и как именно закрыта, используя методы closed(), closedOK(), closedCancel().

Цитата:
Сообщение от gl00mie Посмотреть сообщение
Организуйте как-либо взаимодействие этих форм, например, как это сделано в журналах и строках журналов.Подумайте об организации псевдомодальности.Конечно, можно - через dynalink'и и обработку linkActive() на DS дочерней формы или напрямую через вызов ее методов из родительской формы...
Датасоурсов на формах нет и формы не являются модальными.
В родительской форме вводятся некоторые параметры... Нажимается кнопка, производится навернутый расчет, в дочернюю форму выводится результат. Если все устраивает, выполняется транзакция в БД. Если не устраивает - в родительской форме редактируются параметры и кнопка нажимается заново. При этом дочерняя форма может и не закрываться пользователем самостоятельно...

Вообщем, повторюсь, вопрос состоял не столько в том, "как сделать по другому?"... Сколько в том "Почему перестало работать?".
__________________
Dynamics AX Experience
Старый 22.10.2008, 20:22   #9  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
А не может ли быть проблема в том, что, когда управление еще находится внутри метода wait() (при повторном нажатии на кнопку), formRun уже ссылается на другой объект?

Возникает вопрос, не освобождается ли память сразу после вызова formRun = classFactory (а если судить по HeapCheck то так оно и происходит, счетчик ссылок на объекты sysSetupFormRun не увеличивается).
В этом случае, могут теряться внутренние переманные, которыми оперирует wait(), что может привести к обращению к запрещенным участкам памяти, что, в свою очередь, может привести к вылету

Блин, тавтология какае-то
__________________
Axapta v.3.0 sp5 kr2
Старый 23.10.2008, 11:53   #10  
CDR is offline
CDR
MCTS
MCBMSS
 
236 / 175 (6) ++++++
Регистрация: 27.11.2003
Цитата:
Сообщение от AndyD Посмотреть сообщение
А не может ли быть проблема в том, что, когда управление еще находится внутри метода wait() (при повторном нажатии на кнопку), formRun уже ссылается на другой объект?

Возникает вопрос, не освобождается ли память сразу после вызова formRun = classFactory (а если судить по HeapCheck то так оно и происходит, счетчик ссылок на объекты sysSetupFormRun не увеличивается).
В этом случае, могут теряться внутренние переманные, которыми оперирует wait(), что может привести к обращению к запрещенным участкам памяти, что, в свою очередь, может привести к вылету

Блин, тавтология какае-то
На сколько я понял мысль, имелось ввиду то, что код пытается пересоздаеть объект formRun до того, как отработает wait(), который "держит" предыдущий экземпляр объекта? Это и приводит к обращению к запрещенным участкам памяти и крэшу...?
__________________
Dynamics AX Experience
Старый 23.10.2008, 12:16   #11  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Возможно (на самом деле не просто пытается, а именно пересоздает).

Хотя, я попробовал этот код запустить на DAX2009 (vpc TAP4) и у меня получалось, что после второго клика на кнопку форма пересоздается с модальным эффектом. Т.е. вызывную форму можно активировать, но контролы на ней не реагируют на нажатие (как и рабочие столы DAX). А вызванная форма работает нормально и после ее закрытия модальный эффект снимается.

Возможно, таким образом была реализована защита от крэша, но, по какой-то причине, в релиз она не попала.
__________________
Axapta v.3.0 sp5 kr2
Старый 23.10.2008, 12:18   #12  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Цитата:
Сообщение от AndyD Посмотреть сообщение
Хотя, я попробовал этот код запустить на DAX2009 (vpc TAP4) и у меня получалось, что после второго клика на кнопку форма пересоздается с модальным эффектом. Т.е. вызывную форму можно активировать, но контролы на ней не реагируют на нажатие (как и рабочие столы DAX). А вызванная форма работает нормально и после ее закрытия модальный эффект снимается.

Возможно, таким образом была реализована защита от крэша, но, по какой-то причине, в релиз она не попала.

В релиз это тоже попало. Во всяком случае, у меня так тоже получалось. Думаю, что это просто случайное стечение обстоятельств. В смысле, что как раз из-за удаление старого formRun параметр внутренний модальности принимал другое значение.

Но, если при таком эффекте модальности кликнуть на AreaPage (перейти к главному окну АХ), у меня падала система. Проверь у себя
Старый 23.10.2008, 12:36   #13  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Вообще все окна отрубаются, кроме вызванного. В том числе и дополнительные workspace
__________________
Axapta v.3.0 sp5 kr2
Старый 23.10.2008, 13:27   #14  
CDR is offline
CDR
MCTS
MCBMSS
 
236 / 175 (6) ++++++
Регистрация: 27.11.2003
У меня для DAX2009 ситуация аналогичная DAX4.
Первый и второй клики проходят, форма переоткрывается. На третьем клике - крэш.

Версия DAX2009 - 5.0.593.0
__________________
Dynamics AX Experience
Теги
ax2009, ax3.0, ax4.0

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Microsoft DAX Dev Center Headlines: Microsoft Dynamics AX 2009 Service Pack 1 Has Been Released Blog bot DAX Blogs 0 23.11.2008 12:05
msdynamicsax: DAX 2009 and MS SQL 2008 Blog bot DAX Blogs 0 09.08.2008 14:05
dax-lessons: Generate XML Documentation Files for a project - DAX 2009 Blog bot DAX Blogs 0 08.08.2008 19:06
axStart: Microsoft Dynamics AX 2009 Hot Topics Web Seminar Series Blog bot DAX Blogs 0 06.08.2008 12:05
msdynamicsax: Enterprise Portal development in DAX 2009 Blog bot DAX Blogs 0 18.04.2008 07:06

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 21:12.