|
04.09.2007, 07:39 | #1 |
Участник
|
Задача оптимизации
Я в работе с внутренним проектом столкнулся с проблемой отображения элементов АОТа в FormTreeControl’е Аксапты. Суть в следующем: есть форма SysAOTBrowser. Это лукап форма для выбора элемента АОТа. Все в ней ничего кроме скорости первого раскрытия узлов дерева. К примеру если первый раз раскрыть ветку \Classes то проходит порядка 5 секунд прежде чем все классы отобразятся в дереве. Это очень долго и нужно сделать это время как можно меньше. То есть суть задачи - сделать как можно меньше время тупого ожидания пользователя пока система «продумается».
Последний раз редактировалось rusalaudinov; 04.09.2007 в 07:43. |
|
04.09.2007, 09:10 | #2 |
Участник
|
Цитата:
5 секунд проходит не просто так. В этот момент Аксапта подгружает элементы на клиента. Впоследствии берет из кэша. Вы можете попробовать поиграться с кэшем http://axapta.mazzy.ru/lib/aoscash/ Но если ведется большая разработка, то этот способ не очень поможет |
|
04.09.2007, 10:05 | #3 |
Участник
|
Не пробовал.
Может сделать что-то типа X++: dict = new Dictionary(); for(i = 1; i < dict.classCnt(); i++) { dictClass = new dictClass(dict.classCnt2Id(i)); } Чтобы сразу структура АОТ подтянулась в кэш.. P.S. Проверил. Не помогает Последний раз редактировалось kashperuk; 04.09.2007 в 10:11. |
|
04.09.2007, 11:50 | #4 |
Участник
|
Кстати, если посмотреть форму SysAOT, видим намного более высокую производительность.
|
|
05.09.2007, 06:40 | #5 |
Участник
|
MAzzy, игру с кешем не осилил. вообще не нашел у себя на компьютере файлы *.aoc.
kashperuk, сделал как в форме SYSAOT, стало работать быстрее. КРУТО. |
|
06.09.2007, 10:59 | #6 |
Участник
|
короче всё-равно недостаточно быстро. возникла такая идея. короче чтоб при разворачивании классов система загружала и отображала только ту часть, которая видима в окне. при прокручивании скроллингом подгружалась маленько вновь. такое реально реализовать? как поступить?
|
|
06.09.2007, 11:05 | #7 |
Участник
|
Ну... Если вы считаете, что это "короче", то "легко".
Берете и программируете. Для начала определите высоту окна и количество строк, которое в нем помещается. Потом перехватываете события прокрутки (не забудьте о клавиатуре, мыши и о колесике) Потом делаете хитрую (smart - интеллектуальную) загрузку, которая помнит что загружено, а что не загружено. А потом осталось обеспечить, чтобы ваш многокилометровый код работал быстрее, чем работает ядро В общем, "легко". Несомненно это будет "короче", ведь разбираться с кэшем, находить какие-то мутные aoc-файлы - это так "длинно". |
|
06.09.2007, 11:06 | #8 |
Участник
|
Ну, в принципе можно что-то подобное сделать.
Упростив немного 1. Подгружаем максимум 30 узлов за раз. (первый раз тоже) 2. Появляются кнопочки далее и до конца (для примера смотри кнопки в SQL Server при выборке). 3. Для этого всего нужно итератор постоянно в памяти хранить. Не знаю, как это скажется. 4. Кнопочки вверх не нужны. Тут уже будет скроллинг работать. Тормозов при этом не будет, так как эта часть дерева уже построилась |
|
06.09.2007, 11:17 | #9 |
Участник
|
Еще можно кешировать состав узлов АОТа самостоятельно в файле или табличке.
|
|
06.09.2007, 11:19 | #10 |
Участник
|
Например, ...та-да!!!... в стандартной UtilElements!
Но что я говорю! Ведь эта табличка кэшируется в каком-то мутном aoc-файле, который сложно найти. Несомненно нужно создавать собственную табличку и создавать собственный алгоритм кэширования. |
|
06.09.2007, 11:36 | #11 |
Участник
|
Есть ли у тебя код, который работает также быстро, как и нажатие на + в Classes?
Мне кажется, что есть некая магия в AOTе. Например, нажатие на F12 в редакторе как правило, неприемлемо тормозит, а F2 при прогретом кеше выводит список мнгновенно... |
|
06.09.2007, 11:39 | #12 |
Участник
|
А еще первый раз очень долго создает новый программисткий проект
|
|
06.09.2007, 12:08 | #13 |
Участник
|
|
|
|
За это сообщение автора поблагодарили: mazzy (5). |
07.09.2007, 12:26 | #14 |
Участник
|
mazzy, че ты взъелся то. я не говорил что файлы мутные и не говрил короче в том смысле, в котором ты его интерпретировал.
Собственно говоря размышления привели к тому, что загружать 30 узлов и жать кнопочку снова это не дело. На работе мне подсказали что нужно обратить свой взор на работу с потоками. типа создать отделый поток в котором будет происходить загрузка данных, но который не будет мешать работе основного приложения....короче не знаю насколько понятно я объяснил. лично я никогда дел с потоками не имел и не представляю как оно работает. никто не скажет где можно посмотреть матчасть по этому вопросу, чтобы понять как оно работает и собственно откуда че берется. |
|
07.09.2007, 12:38 | #15 |
Участник
|
в 3.0 потоки не рекомендуется использовать, зотя я знаю людей, у которых они пашут
База знаний ERP : Axapta / нить |
|
07.09.2007, 12:47 | #16 |
Участник
|
у меня 4.0
|
|
07.09.2007, 21:12 | #17 |
Member
|
rusalaudinov, посмотрите функциональность Data Crawler. Там используются threads, насколько я понимаю. В 3.0 тоже.
belugin, а можно для общего развития? Есть более конкретная информация про проблемы со threads в 3.0?
__________________
С уважением, glibs® |
|
10.09.2007, 12:56 | #18 |
Участник
|
вот смотрите. допустим у меня есть класс в котором создан новый поток. допустим есть никак не связанная с ним форма. могу ли я запустить на выполнение метод этой формы в созданном в классепотоке? или есть другой(более простой и удобный) способ запустить метод в отдельном потоке?
|
|
10.09.2007, 13:22 | #19 |
Member
|
rusalaudinov, посмотрите функциональность Data Crawler. Я не уверен, но мне кажется, что вы спрашиваете про что-то подобное.
Там есть форма, которая позволяет запустить на АОСе функциональность индексирования таблиц (в 3.0 для поиска на портале, в 4.0 — для глобального поиска в GUI). При этом клиент продолжает работать, вы можете делать в нем что угодно (см. класс SysDataSearchDaemon). Есть возможность остановить фоновую задачу на АОСе (похоже, через таблицу идет коммуникация). В 3.0 в двухзвенке это не работало (запускалось на клиенте, не в отдельном потоке). Работает только в тонком (трехзвенном) клиенте. Это на всякий случай.
__________________
С уважением, glibs® |
|
10.09.2007, 13:29 | #20 |
Участник
|
glibs, я пытался давно работать в двухзвенке - ничего не получилось - остальное собрано с аксфорума
rusalaudinov, можно еще использовать таймер (см форму поиска по АОТу, База знаний ERP : Axapta / Таймер Без Формы ) |
|
Теги |
aoc, aot, как правильно, кэширование, тормоза |
|
|