Сбой Revit 2016 R2 на UIApplication.OpenAndActivateDocument

Фон

У меня есть надстройка Revit 2016, которая выполняет пакетный экспорт в DWF из основной модели и связанных с ней моделей. Он работает, экспортируя листы из основной модели и просматривая связанные модели для экспорта дополнительных листов. Он использует UIApplication.OpenAndActivateDocument для открытия документа и Document.Close для его закрытия. Поскольку Revit API не позволяет закрыть активный документ, он должен открыть документ-заполнитель, прежде чем он закроет активный документ и откроет следующий. Это работает по крайней мере с Revit 2014, но перестало работать с момента выпуска Revit 2016 R2.

Теперь он не работает при вызове UIApplication.OpenAndActivateDocument при экспорте более пары листов. Даже с самым последним выпуском Revit 2016 R2 Update 4 проблема все еще существует.

Ошибка

Ошибка выброшена из метода UIApplication.OpenAndActivateDocument. Это выглядит так:

System.ComponentModel.Win32Exception был необработан ErrorCode = -2147467259 HResult = -2147467259 Message = Недостаточно квоты для обработки этой команды NativeErrorCode = 1816 Source = WindowsBase StackTrace: в MS.Win32.UnsafeNativeMethods.PostMessage, ms. wparam, IntPtr lparam) в System.Windows.Interop.HwndTarget.UpdateWindowSettings (Boolean enableRenderTarget, Nullable`1 channelSet) в System.Windows.Interop.HwndTarget.UpdateWindowPos (IntPtrop lParam. msg, IntPtr wparam, IntPtr lparam) в System.Windows.Interop.HwndSource.HwndTargetFilterMessage (IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean & hwndProgram, IntPtr lParam, Boolean и обработано), IntPtr.HwndRndPro (IntPtr. wParam, IntPtr lParam, Boolean & handled) в MS.Win32.HwndSubclass.DispatcherCallbackOperation (Object o) в System.Windows.Threading.ExceptionWrapper.InternalRealCall (Delegate ca llback, Object args, Int32 numArgs) в System.Windows.Threading.ExceptionWrapper.TryCatchWhen (источник объекта, обратный вызов делегата, объектные аргументы, Int32 numArgs, делегат catchHandler) в System.Windows.Threading.Dispatcher.LegacyInvokeImplity (приоритет времени DispatcherPrior , Метод делегата, аргументы объекта, число Int32 numArgs) в MS.Win32.HwndSubclass.SubclassWndProc (IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam)

Вот что показывает конец файла журнала:

Теория

Я предполагаю, что проблема началась из-за новой функции, представленной в 2016 R2, которая заставляет экспортировать DWF с использованием нескольких процессов, а не одного, как в предыдущих версиях. Я пробовал опубликовать мою проблему на форумах Autodesk, но до сих пор не получил ответа от службы поддержки.

Я также предполагаю, что он привязан к памяти, поскольку я читал о «Недостаточно квоты для обработки этого командного сообщения» из нескольких интернет-источников, но на моем компьютере 16 ГБ ОЗУ, что должно быть подходящим для Revit.

Есть ли у кого-нибудь еще какие-нибудь идеи?

Я узнал больше об ошибке «Недостаточно квоты для обработки этой команды» из этот вопрос о DataGrid. Очевидно, проблема связана с очередью обмена сообщениями пользовательского интерфейса Windows, которую я не совсем понимаю. Существует очередь для этих базовых вызовов UIApplication.OpenAndActivateDocument функций и ограничение по умолчанию в 10 000 вызовов. При достижении этого лимита отправляется сообщение об ошибке квоты. Я не контролирую базовый код Revit, поэтому я просто решил увеличить этот предел (который хранится как ключ реестра), и это сработало для меня (после перезагрузки компьютера). Мое решение заключалось в том, чтобы установить для следующего раздела реестра значение 1000000:


person skeletank    schedule 26.04.2016    source источник
comment
@ cs1088 Вы имеете в виду _1_? В Revit 2016 API нет _2_.   -  person Colin Stark    schedule 26.04.2016
comment
Да, прости. Я хотел отредактировать комментарий, но время прошло. Вы должны иметь возможность использовать Application.OpenDocumentFile вместо UIApplication.OpenAndActivateDocument   -  person skeletank    schedule 26.04.2016
comment
@ cs1088 Я давно не работал над Revit API, но, если я правильно помню, в прошлом это не работало, потому что я не могу открыть связанную модель, пока основная модель все еще открыта. Я все же попробую.   -  person Colin Stark    schedule 26.04.2016
comment
@ cs1088 _1_ не работает. Я получаю сообщение об ошибке. Документ - это связанный файл. Транзакции можно использовать только в первичных документах (проектах или семьях). Однако мне приходится использовать транзакцию, потому что экспорт в DWF требует использования транзакций в соответствии с поддержкой Autodesk API.   -  person skeletank    schedule 26.04.2016
comment
В итоге я заставил Application.OpenDocumentFile работать, выгрузив ссылки перед загрузкой, а затем перезагрузив их (см. этот ответ). Однако я неизбежно получал ту же ошибку «Недостаточно квоты ...», что и в исходном выпуске.   -  person skeletank    schedule 27.04.2016
comment
Похоже, вы столкнулись с ошибкой Revit, скорее всего ... Ошибка возникает из Application.OpenDocumentFile? Я знаю, что сотрудники Autodesk иногда бывают здесь, надеюсь, они это видят. Если вы являетесь участником ADN, я бы рекомендовал открыть вопрос. В противном случае добавьте в свой первоначальный пост на форумах дополнительную информацию о вашем тестировании с помощью Application.OpenDocumentFile и надейтесь, что кто-нибудь ответит   -  person skeletank    schedule 27.04.2016
comment
@ cs1088 В последний раз, когда я тестировал небольшое количество файлов DWF, он работал нормально, а затем с той же проблемой потерпел неудачу в WPF _1_. Это определенно похоже на ошибку памяти или что-то в этом роде. Я не являюсь участником ADN, но я добавлю к своему сообщению на форуме Autodesk описание попытки с _2_.   -  person Colin Stark    schedule 28.04.2016
comment
вы можете добавить информацию из журнала?   -  person skeletank    schedule 28.04.2016
comment
@AugustoGoncalves Я обновил свой вопрос, включив в него конец файла журнала, когда я запускал его всего пару минут назад.   -  person Augusto Goncalves    schedule 03.05.2016
comment
Это перемещено в: _1_ в редакторе реестра.   -  person skeletank    schedule 03.05.2016


Ответы (2)


HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ WindowsNT \ CurrentVersion \ Windows \ USERPostMessageLimit

Сначала я попробовал 20 000, но ошибка продолжала появляться, поэтому я выбрал произвольно большое число 1 000 000, и ошибка исчезла. Затем я начал тестирование нашей самой большой модели при более низких значениях, и значение 500 000 было минимально возможным параметром, при котором ошибка не вызывалась. На данный момент я позволяю одному пользователю работать с такой настройкой, потому что я не уверен, что это вызовет проблемы с другими приложениями Windows, поскольку это влияет не только на Revit.

Я нашел способ реструктурировать свою программу так, чтобы вместо вызова PostMessage один раз с _2_, содержащим все листы в текущей модели, он вызывал _3_ один раз для каждого листа в текущей модели, передавая _4_, содержащий этот единственный лист . По какой-либо причине это предотвращает сбой Revit, вероятно, потому, что он отказывается от ресурсов, которые обычно вызывают сбой.

person skeletank    schedule 05.08.2016
comment
'2.510552 2: ‹' 1:‹ *** NOBLE сделал недействительными вторичные данные id = 130129 из-за измененного документа ссылки.
'1: ‹*** NOBLE сделал недействительными вторичные данные id = 130130 из-за измененного документа ссылки.
'1: ‹*** NOBLE сделал недействительными вторичные данные, id = 130131 из-за измененного документа ссылки.
' 1:‹ *** NOBLE сделал недействительными вторичные данные id = 130134 из-за измененного документа ссылки.
'1: ‹*** NOBLE сделал недействительными вторичные данные, id = 138258 из-за измененного документа ссылки.
' 1:‹ *** NOBLE сделал недействительными вторичные данные id = 138259 из-за измененного документа ссылки.
' 1: ‹*** NOBLE аннулировал идентификатор вторичных данных = 138983 из-за измененного документа ссылки.
'1:‹ *** NOBLE недействителен ID вторичных данных = 140000 из-за измененного документа ссылки.
' 1: ‹*** NOBLE сделал недействительными вторичные данные id = 5964554 из-за измененного документа ссылки.
'1:‹ *** NOBLE сделал недействительными вторичные данные id = 6073456 из-за измененного документа ссылки.
' 1: ‹0 ModelServerState "D" estroyed ": Current server =" Not Queried ", Model server =" ", Model server state =" Not Applicable "
'6:‹ --TB- Уровень 368 - Уровни: Уровень: FF EL
' 0.104902 6: ‹---------------- - TB- пересчитать схемы
'1.094590 !!!!! 4: !!! BIG_GAP; PERF; MISC; регенерация
'1.315856 3: ‹<; ​​PERF; MISC; регенерация / ALL_GAPS 1.210954 / TurnOff_GAPs 100%
' 1: ‹Произошло управляемое исключение:
'C 3 мая 2016 г. 08: 43: 03.892; 1: ‹Недостаточно квоты для обработки этой команды
'C 03-May-2016 08: 43: 03.892; 1: ‹ExceptionCode = 0xe0434352 ExceptionFlags = 0x00000001 ExceptionAddress = 000007FEFCD0A06D
'1:‹ Система (МБ) [Доступно / всего] [Использование памяти Revit (МБ)]
' 1: ‹Статистика ОЗУ: 9845/16323 3199 = InUse 3243 = Peak
'1: ‹Статистика ВМ: 8381636/8388607 3089 = InUse 3120 = Peak
' 0:‹ [00002088] QueueMinder остановлен
'2: ‹:: 100 :: Delta VM : Доступен +3 -> 8381638 МБ, Использовано 3089 МБ; ОЗУ: доступно +109 -> 9955 МБ, использовано -1 -> 3198 МБ
'C 03-мая-2016 08: 43: 04.652; 2: ‹OMICRON завершил предоставление услуг виртуализации
'C 03-May-2016 08: 43: 04.652; 2: ‹ОМИКРОН закончил обслуживание рабочих
'C 03-May-2016 08: 43: 04.652; 2: ‹Очереди, удаленные OMICRON
'0.760501 2: ‹<' 1:‹ SLOG $ 2360798f 2016-05-03 08: 43: 04.736> Сбой
'1: ‹Система SLOG (МБ) [Доступно / Всего ] [Revit Memory Usage (MB)]
'1: ‹Статистика SLOG RAM: 9957/16323 3198 = InUse 3243 = Peak
' 1:‹ Статистика SLOG VM: 8381643/8388607 3089 = InUse 3120 = Peak < br> '1: ‹SLOG $ 2360798f 2016-05-03 08:43:04. 746 '1: ‹Обновление зависимостей FileCheckTrigger
' 1:‹ Регистрация стороннего средства обновления 'Revit: ObjectNumberingUpdater' отменена.
'1: ‹Регистрация средства стороннего обновления' Revit: ObjectNumberingUpdater 'отменена.
' 1: ‹До: уничтожить диспетчер отображения
'1:‹ Система (МБ) [Доступно / всего] [Использование памяти Revit (МБ)]
' 1: ‹Статистика ОЗУ: 9956/16323 3198 = Используется 3243 = Пик
'1: ‹Статистика ВМ: 8381643/8388607 3089 = InUse 3120 = Пик
' 1:‹ После: Уничтожить диспетчер отображения
'1: ‹Система (МБ) [Доступно / Всего] [Revit Использование памяти (МБ)]
'1: ‹Статистика RAM: 9956/16323 3198 = InUse 3243 = Peak
' 1:‹ Статистика VM: 8381643/8388607 3089 = InUse 3120 = Peak
'1: ‹Компактное пространство данных: 380388 блоков, всего 165719148 байт> '1:‹ освобождено 380388 блоков
' 2: ‹:: 100 :: Delta VM: Avail +36 -> 8381675 МБ, использовано 3089 МБ; Оперативная память: Доступно -2 -> 9953 МБ, использовано -1 -> 3197 МБ
'2: ‹DBG_INFO: Обнаружено незамороженное изменение выделения .: строка 609 файла d: \ sunrise \ 2016_px64 \ source \ revit \ revitui \ modscope \ ModScope.cpp.
'2: ‹; PERF; MISC; FullUpdateGraphicCacheUpdater :: updateAll () DBViewProject id = 275: 2545 элементов требуют обновления кеша
' 1:‹ Unconverted MessageBox "Произошла фатальная ошибка. приложение будет закрыто.У вас есть возможность сохранить файлы восстановления для всех ваших измененных проектов. - person JayRizzo; 31.03.2020

Обратите внимание, что при этом файлы DWF будут экспортироваться последовательно, а не параллельно, потому что, только передав несколько листов за один вызов, вы сможете воспользоваться преимуществами многопроцессного экспорта, представленного в Revit 2016 R2. По иронии судьбы последовательный метод так же быстр, как и параллельный.

Возможно, не имеет отношения к проблеме, но могу ли я спросить, почему вы используете OpenAndActivate для экспорта файлов DWF, а не просто Open? В активации модели нет необходимости, и вы сможете закрыть модель, не требуя заполнителя.

person skeletank    schedule 25.08.2016