22.10.2008, 15:23 | #1 |
MCTS
|
Крэш 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(); } Соответственно вопрос: это новый баг? новая фича? или это только у меня подобное? Во вложении два проекта: для 3.0 и 4.0 соответственно.
__________________
Dynamics AX Experience Последний раз редактировалось CDR; 22.10.2008 в 15:26. |
|
|
За это сообщение автора поблагодарили: kashperuk (5). |
22.10.2008, 15:51 | #2 |
Участник
|
Похоже на баг.
Попробую подтвердить/опровергнуть это в ближайшее время. Также возможно workaround какой-то придумаем. |
|
|
За это сообщение автора поблагодарили: CDR (1). |
22.10.2008, 16:17 | #3 |
Участник
|
Вот я сижу и думаю, а почему вы вообще используете wait(), а не detach()?
Ведь смысл Wait() состоит в том, чтобы долждаться закрытия дочерней формы перед продолжением исполнения кода родительской. Проверил с detach() - у меня обвалов системы не наблюдается |
|
22.10.2008, 16:30 | #4 |
MCTS
|
Цитата:
Есть родительская форма, с нее по кнопке открывается дочерняя... При этом в родительской форме необходимо иметь возможность контролировать дочернюю форму. Пока открыта дочерняя форма, родительская форма не должна закрываться (поведение, как у диалогов на RunBaseBatch). При повторном нажатии на кнопку форму необходимо переоткрыть.... Это нужно для обновления данных в дочерней форме. Вроде ничего криминального . Понятно, что это можно обойти и решить по другому, например сделать обновление формы без ее закрытия... Непонятно, почему в трешке работает, в новых версиях - крэш. Это с чем-то жизненным связано или просто так сделали?
__________________
Dynamics AX Experience |
|
22.10.2008, 16:35 | #5 |
Участник
|
Цитата:
X++: new MenuFunction(menuitemdisplaystr(InventTable), MenuItemType::Display).run( args ); |
|
22.10.2008, 16:45 | #6 |
Участник
|
Цитата:
Цитата:
|
|
22.10.2008, 16:47 | #7 |
MCTS
|
Цитата:
Сообщение от gl00mie
Если использовать detach(), то вообще смысл заморочек с formRun теряется - разве что оставлять ссылку на форму, чтобы закрыть ее при следующем нажатии кнопки... если не ждать завершения работы формы, то проще использовать конструкцию вида... Заодно проверка прав доступа на пункте меню отработает...
А вообще - да, запуск формы должен везде, где получается, быть по менюитему. Нет, ничего не происходит, хотя formRun действительно продолжает жить...
__________________
Dynamics AX Experience |
|
22.10.2008, 17:11 | #8 |
MCTS
|
Цитата:
Сообщение от gl00mie
Контролировать каким образом? Заметьте, что пользователь может закрыть дочернюю форму, и, если она в методе close() как-то не информирует об этом форму родительскую, то та об этом и не узнает - объект FormRun дочерней формы будет все также спокойно жить в контексте формы родительской.
Цитата:
Сообщение от gl00mie
Организуйте как-либо взаимодействие этих форм, например, как это сделано в журналах и строках журналов.Подумайте об организации псевдомодальности.Конечно, можно - через dynalink'и и обработку linkActive() на DS дочерней формы или напрямую через вызов ее методов из родительской формы...
В родительской форме вводятся некоторые параметры... Нажимается кнопка, производится навернутый расчет, в дочернюю форму выводится результат. Если все устраивает, выполняется транзакция в БД. Если не устраивает - в родительской форме редактируются параметры и кнопка нажимается заново. При этом дочерняя форма может и не закрываться пользователем самостоятельно... Вообщем, повторюсь, вопрос состоял не столько в том, "как сделать по другому?"... Сколько в том "Почему перестало работать?".
__________________
Dynamics AX Experience |
|
22.10.2008, 20:22 | #9 |
Участник
|
А не может ли быть проблема в том, что, когда управление еще находится внутри метода wait() (при повторном нажатии на кнопку), formRun уже ссылается на другой объект?
Возникает вопрос, не освобождается ли память сразу после вызова formRun = classFactory (а если судить по HeapCheck то так оно и происходит, счетчик ссылок на объекты sysSetupFormRun не увеличивается). В этом случае, могут теряться внутренние переманные, которыми оперирует wait(), что может привести к обращению к запрещенным участкам памяти, что, в свою очередь, может привести к вылету Блин, тавтология какае-то
__________________
Axapta v.3.0 sp5 kr2 |
|
23.10.2008, 11:53 | #10 |
MCTS
|
Цитата:
Сообщение от AndyD
А не может ли быть проблема в том, что, когда управление еще находится внутри метода wait() (при повторном нажатии на кнопку), formRun уже ссылается на другой объект?
Возникает вопрос, не освобождается ли память сразу после вызова formRun = classFactory (а если судить по HeapCheck то так оно и происходит, счетчик ссылок на объекты sysSetupFormRun не увеличивается). В этом случае, могут теряться внутренние переманные, которыми оперирует wait(), что может привести к обращению к запрещенным участкам памяти, что, в свою очередь, может привести к вылету Блин, тавтология какае-то
__________________
Dynamics AX Experience |
|
23.10.2008, 12:16 | #11 |
Участник
|
Возможно (на самом деле не просто пытается, а именно пересоздает).
Хотя, я попробовал этот код запустить на DAX2009 (vpc TAP4) и у меня получалось, что после второго клика на кнопку форма пересоздается с модальным эффектом. Т.е. вызывную форму можно активировать, но контролы на ней не реагируют на нажатие (как и рабочие столы DAX). А вызванная форма работает нормально и после ее закрытия модальный эффект снимается. Возможно, таким образом была реализована защита от крэша, но, по какой-то причине, в релиз она не попала.
__________________
Axapta v.3.0 sp5 kr2 |
|
23.10.2008, 12:18 | #12 |
Участник
|
Цитата:
Сообщение от AndyD
Хотя, я попробовал этот код запустить на DAX2009 (vpc TAP4) и у меня получалось, что после второго клика на кнопку форма пересоздается с модальным эффектом. Т.е. вызывную форму можно активировать, но контролы на ней не реагируют на нажатие (как и рабочие столы DAX). А вызванная форма работает нормально и после ее закрытия модальный эффект снимается.
Возможно, таким образом была реализована защита от крэша, но, по какой-то причине, в релиз она не попала. В релиз это тоже попало. Во всяком случае, у меня так тоже получалось. Думаю, что это просто случайное стечение обстоятельств. В смысле, что как раз из-за удаление старого formRun параметр внутренний модальности принимал другое значение. Но, если при таком эффекте модальности кликнуть на AreaPage (перейти к главному окну АХ), у меня падала система. Проверь у себя |
|
23.10.2008, 12:36 | #13 |
Участник
|
Вообще все окна отрубаются, кроме вызванного. В том числе и дополнительные workspace
__________________
Axapta v.3.0 sp5 kr2 |
|
23.10.2008, 13:27 | #14 |
MCTS
|
У меня для DAX2009 ситуация аналогичная DAX4.
Первый и второй клики проходят, форма переоткрывается. На третьем клике - крэш. Версия DAX2009 - 5.0.593.0
__________________
Dynamics AX Experience |
|
Теги |
ax2009, ax3.0, ax4.0 |
|
|