powered by simpleCommunicator - 2.0.39     © 2025 Programmizd 02
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Особенности с Set Application = Nothing при автоматизации
7 сообщений из 7, страница 1 из 1
Особенности с Set Application = Nothing при автоматизации
    #38682980
LeCrunch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Составил макрос для 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
Особенности с Set Application = Nothing при автоматизации
    #38682988
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По идее, ничего страшного не произойдет, переменная выйдет из области видимости и сборщик все равно уберет мусор. В теории. Хотя, конечно, от СОМ можно ожидать разных подстав.

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

Проведите эксперимент - уберите "получение данных из каждого док-та". Пусть файлы просто открываются и закрываются. Останется эффект? Какими особенностями обладают открываемые файлы (связи с внешними данными, картинки и т.п.)?
...
Рейтинг: 0 / 0
Особенности с Set Application = Nothing при автоматизации
    #38683223
LeCrunch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Закомментировал область с "получение данных из каждого док-та", но положительной разницы не замечено. Сами файлы 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
Особенности с Set Application = Nothing при автоматизации
    #38683243
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LeCrunchЗакомментировал область с "получение данных из каждого док-та", но положительной разницы не замечено.странно, честно говоря, не должно быть таких показателей... а если попробовать открывать-закрывать чистые файлы? А на другом компе?
...
Рейтинг: 0 / 0
Особенности с Set Application = Nothing при автоматизации
    #38694983
LeCrunch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Проблема решена!
Храню все основные макросы в PERSONAL.XLSB и похоже, со временем этот важный файл "покривел".
Вылечил просто - переместил его из профиля %AppData%\Microsoft\Excel\XLSTART в другую папку, создал новую "Личную книгу макросов" и по одному их перенес из старой книги в новую.
Теперь для любого кол-ва файлов - время выгрузки Word ~0 сек :)
...
Рейтинг: 0 / 0
Особенности с Set Application = Nothing при автоматизации
    #38695062
Фотография The_Prist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LeCrunch,

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


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

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


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