Гость
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Особенности с Set Application = Nothing при автоматизации / 7 сообщений из 7, страница 1 из 1
29.06.2014, 13:30
    #38682980
LeCrunch
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Особенности с Set Application = Nothing при автоматизации
Составил макрос для 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.
...
    Dim WDApp As Object
    Dim wdDoc As Object
    On Error Resume Next
    Set WDApp = CreateObject("Word.Application")
    WDApp.Visible = False
...
        Do While Len(sName) > 0
            i = i + 1
            wdFileName = sPath & sName
            
            Set wdDoc = WDApp.Documents.Open _
                (FileName:=wdFileName, _
                ReadOnly:=True, _
                Visible:=False, _
                AddToRecentFiles:=False)
            With wdDoc
...
' получение данных из каждого док-та
...
            End With            
            wdDoc.Close SaveChanges:=False
            Set wdDoc = Nothing
            sName = Dir
        Loop

'    закрытие процесса Word
    WDApp.Quit SaveChanges:=0
    WDApp.Close

'    освобождение переменной
    Set WDApp = Nothing  ' ТУТ Задержка!
...

Процесс непосредственного извлечения и последующей обработки данных из документов работает корректно и достаточно быстро, однако замечено, что на завершающем этапе возникает ощутимая задержка. Отключение всех (немногих) надстроек Word результата не дало. Последовательный анализ выявил, что причиной является строчка кода Set WDApp = Nothing. Причем время задержки прямо пропорционально количеству обработанных макросом файлов Word (может доходить до нескольких сотен) - похоже на медленное освобождения их из кэша в памяти(?)

Поискал по этой теме - нашел аналогичный вопрос и статью "When Are You Required To Set Objects To Nothing?"

Продолжая эксперименты, закомментировал эту строчку кода и задержка завершения макроса сразу пропала. В диспетчере задач Windows правда видно, что после завершения макроса процесс winword.exe в нём пока еще "висит", но через несколько секунд он сам пропадает, а главное, уже не тормозит весь макрос. Если до исчезновения процесса открыть новый документ Word, то он запускается нормально, как новый процесс winword, и конфликта с пока еще оставшимся не возникает.

Хотелось бы посоветоваться с опытными разработчиками по замеченной особенности
Насколько корректен и в дальнейшем беспроблемен такой вариант без Set WDApp = Nothing?
Есть ли решения по форсированному освобождению переменной из памяти?
...
Рейтинг: 0 / 0
29.06.2014, 13:46
    #38682988
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Особенности с Set Application = Nothing при автоматизации
По идее, ничего страшного не произойдет, переменная выйдет из области видимости и сборщик все равно уберет мусор. В теории. Хотя, конечно, от СОМ можно ожидать разных подстав.

Как ведет себя память при этом? Растет ли занимаемая процессом память пропорционально увеличению обработанных документов?

Проведите эксперимент - уберите "получение данных из каждого док-та". Пусть файлы просто открываются и закрываются. Останется эффект? Какими особенностями обладают открываемые файлы (связи с внешними данными, картинки и т.п.)?
...
Рейтинг: 0 / 0
29.06.2014, 23:20
    #38683223
LeCrunch
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Особенности с Set Application = Nothing при автоматизации
Закомментировал область с "получение данных из каждого док-та", но положительной разницы не замечено. Сами файлы Word - несложные одностраничные однотипные документы, заполненные, в свою очередь, не вручную, а автоматически - несколько таблиц и текст, графики нет.
Процесс Word стартует и забирает под себя около ~ 20 МБайт, в зависимости от кол-ва документов медленно возрастает, для 200 шт. примерно до ~ 40 МБайт (Win7 64bit, MSO 2010 sp2 32bit)

Поставил отметки
Код: vbnet
1.
2.
3.
4.
c = Now
    Set WDApp = Nothing
d = Now
Debug.Print DateDiff("s", c, d) & " сек."

и определил, что время выгрузки процесса winword.exe зависит от кол-ва обработанных файлов примерно так: 21 шт. ~ 3 сек., 38 шт. ~ 4 сек., 84 шт. ~ 6 сек., 210 шт. ~ 16 сек.; при том, что перенос данных в Excel осуществляется со скоростью до десяти документов в секунду...
...
Рейтинг: 0 / 0
30.06.2014, 00:14
    #38683243
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Особенности с Set Application = Nothing при автоматизации
LeCrunchЗакомментировал область с "получение данных из каждого док-та", но положительной разницы не замечено.странно, честно говоря, не должно быть таких показателей... а если попробовать открывать-закрывать чистые файлы? А на другом компе?
...
Рейтинг: 0 / 0
12.07.2014, 15:12
    #38694983
LeCrunch
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Особенности с Set Application = Nothing при автоматизации
Проблема решена!
Храню все основные макросы в PERSONAL.XLSB и похоже, со временем этот важный файл "покривел".
Вылечил просто - переместил его из профиля %AppData%\Microsoft\Excel\XLSTART в другую папку, создал новую "Личную книгу макросов" и по одному их перенес из старой книги в новую.
Теперь для любого кол-ва файлов - время выгрузки Word ~0 сек :)
...
Рейтинг: 0 / 0
12.07.2014, 17:55
    #38695062
The_Prist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Особенности с Set Application = Nothing при автоматизации
LeCrunch,

А что это?
Код: vbnet
1.
2.
WDApp.Quit SaveChanges:=0
WDApp.Close


Не знал, что у объекта Application есть метод Close. Всегда считал, что этот метод относится к документу. И метод Quit вроде как закрывает полностью Word и применять после этого Close как минимум странно - ведь объект уже закрыт.
...
Рейтинг: 0 / 0
12.07.2014, 19:17
    #38695093
LeCrunch
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Особенности с Set Application = Nothing при автоматизации
The_Prist,
да, похоже переусердствовал - строчка WDApp.Close здесь лишняя)

В целом действовал по образцу гуру этого форума, которого что-то давно не видно...
...
Рейтинг: 0 / 0
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Особенности с Set Application = Nothing при автоматизации / 7 сообщений из 7, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]