|
Особенности с Set Application = Nothing при автоматизации
|
|||
---|---|---|---|
#18+
Составил макрос для Excel для получения информации из папки с документами Word (поздняя привязка) и помещением данных в таблицу Excel и последующей обработки (MSO 2010 SP2). Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33.
Процесс непосредственного извлечения и последующей обработки данных из документов работает корректно и достаточно быстро, однако замечено, что на завершающем этапе возникает ощутимая задержка. Отключение всех (немногих) надстроек Word результата не дало. Последовательный анализ выявил, что причиной является строчка кода Set WDApp = Nothing. Причем время задержки прямо пропорционально количеству обработанных макросом файлов Word (может доходить до нескольких сотен) - похоже на медленное освобождения их из кэша в памяти(?) Поискал по этой теме - нашел аналогичный вопрос и статью "When Are You Required To Set Objects To Nothing?" Продолжая эксперименты, закомментировал эту строчку кода и задержка завершения макроса сразу пропала. В диспетчере задач Windows правда видно, что после завершения макроса процесс winword.exe в нём пока еще "висит", но через несколько секунд он сам пропадает, а главное, уже не тормозит весь макрос. Если до исчезновения процесса открыть новый документ Word, то он запускается нормально, как новый процесс winword, и конфликта с пока еще оставшимся не возникает. Хотелось бы посоветоваться с опытными разработчиками по замеченной особенности Насколько корректен и в дальнейшем беспроблемен такой вариант без Set WDApp = Nothing? Есть ли решения по форсированному освобождению переменной из памяти? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.06.2014, 13:30 |
|
Особенности с Set Application = Nothing при автоматизации
|
|||
---|---|---|---|
#18+
По идее, ничего страшного не произойдет, переменная выйдет из области видимости и сборщик все равно уберет мусор. В теории. Хотя, конечно, от СОМ можно ожидать разных подстав. Как ведет себя память при этом? Растет ли занимаемая процессом память пропорционально увеличению обработанных документов? Проведите эксперимент - уберите "получение данных из каждого док-та". Пусть файлы просто открываются и закрываются. Останется эффект? Какими особенностями обладают открываемые файлы (связи с внешними данными, картинки и т.п.)? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.06.2014, 13:46 |
|
Особенности с Set Application = Nothing при автоматизации
|
|||
---|---|---|---|
#18+
Закомментировал область с "получение данных из каждого док-та", но положительной разницы не замечено. Сами файлы Word - несложные одностраничные однотипные документы, заполненные, в свою очередь, не вручную, а автоматически - несколько таблиц и текст, графики нет. Процесс Word стартует и забирает под себя около ~ 20 МБайт, в зависимости от кол-ва документов медленно возрастает, для 200 шт. примерно до ~ 40 МБайт (Win7 64bit, MSO 2010 sp2 32bit) Поставил отметки Код: vbnet 1. 2. 3. 4.
и определил, что время выгрузки процесса winword.exe зависит от кол-ва обработанных файлов примерно так: 21 шт. ~ 3 сек., 38 шт. ~ 4 сек., 84 шт. ~ 6 сек., 210 шт. ~ 16 сек.; при том, что перенос данных в Excel осуществляется со скоростью до десяти документов в секунду... ... |
|||
:
Нравится:
Не нравится:
|
|||
29.06.2014, 23:20 |
|
Особенности с Set Application = Nothing при автоматизации
|
|||
---|---|---|---|
#18+
LeCrunchЗакомментировал область с "получение данных из каждого док-та", но положительной разницы не замечено.странно, честно говоря, не должно быть таких показателей... а если попробовать открывать-закрывать чистые файлы? А на другом компе? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.06.2014, 00:14 |
|
Особенности с Set Application = Nothing при автоматизации
|
|||
---|---|---|---|
#18+
Проблема решена! Храню все основные макросы в PERSONAL.XLSB и похоже, со временем этот важный файл "покривел". Вылечил просто - переместил его из профиля %AppData%\Microsoft\Excel\XLSTART в другую папку, создал новую "Личную книгу макросов" и по одному их перенес из старой книги в новую. Теперь для любого кол-ва файлов - время выгрузки Word ~0 сек :) ... |
|||
:
Нравится:
Не нравится:
|
|||
12.07.2014, 15:12 |
|
Особенности с Set Application = Nothing при автоматизации
|
|||
---|---|---|---|
#18+
LeCrunch, А что это? Код: vbnet 1. 2.
Не знал, что у объекта Application есть метод Close. Всегда считал, что этот метод относится к документу. И метод Quit вроде как закрывает полностью Word и применять после этого Close как минимум странно - ведь объект уже закрыт. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.07.2014, 17:55 |
|
Особенности с Set Application = Nothing при автоматизации
|
|||
---|---|---|---|
#18+
The_Prist, да, похоже переусердствовал - строчка WDApp.Close здесь лишняя) В целом действовал по образцу гуру этого форума, которого что-то давно не видно... ... |
|||
:
Нравится:
Не нравится:
|
|||
12.07.2014, 19:17 |
|
|
start [/forum/topic.php?fid=61&msg=38694983&tid=2173934]: |
0ms |
get settings: |
10ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
36ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
48ms |
get tp. blocked users: |
1ms |
others: | 292ms |
total: | 423ms |
0 / 0 |