[CDR X5-X8] Почему при повторении макроса время выполнения увеличивается?

  • Автор темы Автор темы flamber
  • Дата начала Дата начала

flamber

Участник
Топикстартер
Сообщения
17
Реакции
1
Привет всем! Есть программа очень большая и затейливая. Столкнулся с проблемой увеличения времени работы при последующих её выполнениях. Т.е. После перезагрузки Corel она выполняется 25 сек. Удаляю что нарисовала и снова запускаю. Выполняется уже 35сек и так по нарастающей. Коннекты к безе данных закрываю, массивы обнуляю. Вопрос, что на это может влиять?
 

Не по теме:
Ванги в чате есть?'hmmm'
 
  • Спасибо
Реакции: flamber
Да конечно! :)
 

Вложения

Уже лучше :)

Не по теме:

Если верно понял там куча действий. Может попробовать очищать откаты?

 
  • Спасибо
Реакции: flamber

Не по теме:
Чем-то напомнило, как во времена первых персоналок при поломке компьютера брали со стола монитор и везли в ремонт.

Пока же могу посоветовать вместо постоянного деления чисел на 25.4 воткнуть в начало ActiveDocument.Unit = cdrMillimeter. С тормозами не поможет, но будет красивее.

 
Последнее редактирование:
  • Спасибо
Реакции: flamber
Привет всем! Есть программа очень большая и затейливая. Столкнулся с проблемой увеличения времени работы при последующих её выполнениях. Т.е. После перезагрузки Corel она выполняется 25 сек. Удаляю что нарисовала и снова запускаю. Выполняется уже 35сек и так по нарастающей. Коннекты к безе данных закрываю, массивы обнуляю. Вопрос, что на это может влиять?
Программу не смотрел, но осуждаю, хочу сказать, что VBA - крайне сырой и глючный инструмент для программирования серьезного софта, гораздо менее надежный, чем даже javascript, в плане оптимизации очистки мусора и дефрагментации. Особенно в кореловской реализации. Поэтому следует избегать итерационных операций рисования-удаления обьектов, не загружать очередь Undo и отключать промежуточные прорисовки. В идеале - если программа большая и затейливая, вообще отказаться от кореловского движка операций с обьектами, перенести их в натив, отрисовав только конечный результат.
 
  • Спасибо
Реакции: flamber и Chiga

Не по теме:
Чем-то напомнило, как во времена первых персоналок при поломке компьютера брали со стола монитор и везли в ремонт.

Пока же могу посоветовать вместо постоянного деления чисел на 25.4 воткнуть в начало ActiveDocument.Unit = cdrMillimeter. С тормозами не поможет, но будет красивее.


Спасибо! Воткну обязательно!
 
Программу не смотрел, но осуждаю, хочу сказать, что VBA - крайне сырой и глючный инструмент для программирования серьезного софта, гораздо менее надежный, чем даже javascript, в плане оптимизации очистки мусора и дефрагментации. Особенно в кореловской реализации. Поэтому следует избегать итерационных операций рисования-удаления обьектов, не загружать очередь Undo и отключать промежуточные прорисовки. В идеале - если программа большая и затейливая, вообще отказаться от кореловского движка операций с обьектами, перенести их в натив, отрисовав только конечный результат.
То что в файле это маленький кусочек. Переписывать все времени просто нет. Спасибо за совет!
 
То что в файле это маленький кусочек. Переписывать все времени просто нет. Спасибо за совет!
Тогда смириться. У меня, помнится, тоже когда-то был макрос, прямо скажем, вроде, не шибко и сложный, последовательность действий строго линейная, да вот, хватало его работы ровно на один раз - после отработки надо было перезагрузить корел, иначе повторный запуск чудить начинал изрядно, причем, совершенно непредсказуемо. VBA - зло.
 
  • Спасибо
Реакции: flamber
Ураа!!! Нашел тормоз!!!

Было:
Set eff1 = s.CreateContour(Direction, dd, 1)
Set B = eff1.Separate
B.Item(1).Cut
Set A = Lay.Paste

Переделал:
Set eff1 = s.CreateContour(Direction, dd, 1)
Set B = eff1.Separate
Set A = B.Item(1).Duplicate
B.Item(1).Delete
A .MoveToLayer Lay

Скорость увеличилась раз в 200 и нет эффекта накопления задержки!
 
Последнее редактирование:
Да, в Кореле операции с буфером обмена крайне неспешно рабатают
 
  • Спасибо
Реакции: flamber
Ураа!!! Нашел тормоз!!!

Было:
Set eff1 = s.CreateContour(Direction, dd, 1)
Set B = eff1.Separate
B.Item(1).Cut
Set A = Lay.Paste

Переделал:
Set eff1 = s.CreateContour(Direction, dd, 1)
Set B = eff1.Separate
Set A = B.Item(1).Duplicate
B.Item(1).Delete
A .MoveToLayer Lay

Скорость увеличилась раз в 200 и нет эффекта накопления задержки!
Сколько секунд у вас создается пустой документ? Должен создаваться практически мгновенно. Если это не так пройдите по пути и удалите этот файл "C:\Users\.\AppData\Roaming\Corel\CorelDRAW Graphics Suite (ваша версия)\Draw\Object Data\ObjectData.xml".
Его нормальный размер - 2кб. Если больше - удаляйте. Файл создастся снова размером 2кб. Далее в настройках безопасности запретите запись в этот файл. Вы удивитесь насколько ускорится работа корела в общем и буфера обмена в частности.
1735477295483.png
 
Переделал:
Set eff1 = s.CreateContour(Direction, dd, 1)
Set B = eff1.Separate
Set A = B.Item(1).Duplicate
B.Item(1).Delete
A .MoveToLayer Lay

а зачем так много лишних действий?

если вы сначала дублируете потом этот объект удаляете?
не проще ли сразу его B.Item(1).MoveToLayer Lay
 
  • Спасибо
Реакции: flamber
а зачем так много лишних действий?

если вы сначала дублируете потом этот объект удаляете?
не проще ли сразу его B.Item(1).MoveToLayer Lay
В дальнейшем этот вектор нужен как отдельный, а не в составе ShapeRange
 
Сколько секунд у вас создается пустой документ? Должен создаваться практически мгновенно. Если это не так пройдите по пути и удалите этот файл "C:\Users\.\AppData\Roaming\Corel\CorelDRAW Graphics Suite (ваша версия)\Draw\Object Data\ObjectData.xml".
Его нормальный размер - 2кб. Если больше - удаляйте. Файл создастся снова размером 2кб. Далее в настройках безопасности запретите запись в этот файл. Вы удивитесь насколько ускорится работа корела в общем и буфера обмена в частности.
Посмотреть вложение 170354
Да был 1500Kb. Спасибо!