ObjectARX, AutoCAD. Среда программирования библиотеки C++

         

Проблемы длинных транзакций для объектов пользователя


Длинные транзакции – метод борьбы против обычных проблем, следующих из объектов, которые не должны имитироваться, или меж-объектные ссылки, которые не обработаны.

Если LongTransactionManager (LTM) находит, что это должно имитировать,  фильтрованный класс возражает против законченного длинную операционную отладку () или checkIn (), это прервет полную операцию. Если это находит AcDbSoftPointerId или AcDbHardPointerId, который не в имитации IdMap, это также прервется.

Приложения, которые должны предотвратить их объекты от включения как имитируется в длинных трудах, должны регистрировать те объекты, использующие AcApLongTransactionManager::addClassFilter () функция.

AcDbProxyEntity и AcDbProxyObject всегда фильтруются, так когда приложение - не, подарок{*настоящее*}, все его объекты будет фильтрован автоматически.

Wblock имитирующие маркеры{*дескрипторы*} все жесткие ссылки{*справочники*} указателя, но глубоко имитация не требует никакого типа ссылки{*справочников*}, которая будет отображена. Оба из этих типов имитации используются в длинных трудах, в зависимости от типа сделки, это. Если прикладные использования или этих типов ссылок{*справочников*}, или маркеров{*дескрипторов*} xdata, то его объекты будут отклонены от длинных трудов, если приложение берет дополнительные шаги, чтобы обработать ссылки{*справочники*}. Это означает, что, если приложение не загружено, то его объекты и ссылки{*справочники*} будут автоматически предотвращены от участия в длинных трудах, и любые данные должны сохраниться в его Отсутствие.

Используйте длинные операционные и глубокие уведомления аналога, чтобы прервать имитацию их объекта и ссылок{*справочников*}, и добавляться необходима ли имитация объекта или отображение. См. глубокую документацию уведомления аналога и выборки для получения дополнительной информации на этом.

Если объект с мягкой ссылкой{*справочниками*} указателя имитируется (или жесткая ссылка{*справочники*} указателя в глубоком аналоге), приложение должно удостовериться, что ссылка{*справочники*} ИДЕНТИФИКАТОР находится в IdMap, или как отображенная пара ИДЕНТИФИКАТОРА, или имитируемая пара ИДЕНТИФИКАТОРА. Отображения обычно используются, когда объекты обращаются{*относятся*} к некоторому общему{*обычному*} словарю, который приложение обслуживает{*поддерживает*} в пределах рисунка. В глубоком аналоге, отображение может состоять из IdPair, где key = value. В аналоге wblock между рисунками, IdPair отобразил бы словарь одной базы данных со словарем другой базы данных.


Ссылка{*справочники*} имитируется приложением, используя или deepClone () или wblockClone () от повторного вызова уведомления.

Взятие этих шагов гарантирует “ транзитивное замкнутое выражение. ”, чтобы гарантировать что,  набор объектов, которые обращаются{*относятся*} к друг другу, может быть проверен, и затем проверен назад в снова, без того, чтобы ломать{*нарушить*} отношения объекта, все связанные объекты проверены вместе. Например, если любую границу или ассоциативная штриховка непосредственно пропускают в отладку (), код штриховки прибавляет, что вся граница возражает против списка объектов, которые будут проверены. Это - то, как это достигает транзитивного замкнутого выражения. Если бы это не случалось, LTM нашел бы мягкий указатель IDs штриховки на его границы. Если это нашло, что граничный объект, столь упомянутый отсутствовал от имитации, длинная сделка будет прервана. Если это не делал этого, даже если никакие изменения{*замены*} не были сделаны к проверенной штриховке, первоначальная штриховка будет терять ее ассоциативность на регистрации.

Иногда, имеются известные ссылки{*справочники*}, которые не должны быть решены. Одно местоположение было бы объект, который следит за всеми объектами, которые используют это. Например, блочные отчеты{*записи*} таблицы сохраняют список всех блочных ссылок{*справочников*}, которые используют их. Правильно только проверить одну из ссылок{*справочников*}, так что Вы должны позволить длинному операционному механизму знать, что остальная часть ссылок{*справочников*} не должна имитироваться. Имеются несколько путей, которыми это может быть сделано.

Имеются некоторые примеры:

§         если приложение знает, относительно, которые объекты упомянуты, но не будут имитироваться — в beginWblockObjects (), beginDeepClone (), или beginCheckOut () уведомление —, они могут прибавлять объект ID упомянутого объекта к IdMap для имитации. Рекомендуемый подход состоит в том, чтобы установить значение в NULL, и idPair как не имитируемый. Например idMap.assign (idPair (идентификатор, AcDbObjectId:: kNull, kFalse); Если объект должен имитироваться позже, idPair будет изменен{*заменен*} соответственно.



§         вышеупомянутое отображение мог также быть сделан изнутри wblockClone объекта () метод, если это уже отменяет.

§         если ссылка{*справочники*} - компонент данных объекта, который зарегистрирован из использования dwgOutFields (), тогда может быть возможно избежать длинного операционного испытания законности. Испытание сделано,  регистрируя из ИДЕНТИФИКАТОРОВ, использующих тип kIdFiler регистратора. Чтобы избегать испытания, делайте не файл из ИДЕНТИФИКАТОРОВ, которые не должны имитироваться, в течение этого типа записи в файл. Однако, не проведите{*держите*} никакое монопольное использование ИДЕНТИФИКАТОРАМИ из этой записи в файл, или других особенностей, которые используют этого регистратора, подобно частичному сохраняют{*экономят*} и загружают, не может должным образом обрабатывать ваши объекты. Единственные безопасные ИДЕНТИФИКАТОРЫ, чтобы отказать от этого регистратора - объекты AcDbSoftPointerId и AcDbHardPointerId.



§         если ИДЕНТИФИКАТОР - фактически в постоянном реакторе, возможно найти это, используя реактор iterator. Имеется пример того, как объект словаря находит и прибавляет его ИДЕНТИФИКАТОР к IdMap в течение beginWblockClone () уведомление.

beginWblockClone(..., AcDbIdMapping& idMap)

{

...

AcDbDictionaryIterator* pIter = pDict->newIterator();

AcDbObject* pObj;

for ( ; !pIter->done(); pIter->next()) {

acdbOpenObject(pObj, pIter->objectId(), kForRead);

AcDbVoidPtrArray* pReactors = pObj->reactors();

void* pReactor;

AcDbObjectId rId;

MyReactor* pMyReactor;

if (pReactors) {

for (int i = 0; i < pReactors->length(); i++) {

pReactor = pReactors->at(i);

if (acdbIsPersistentReactor(pReactor)) {

rId = acdbPersistentReactorObjectId(pReactor);

if (acdbOpenObject(pMyReactor, rId, kForRead) == eOk) {

pMyReactor->close();

AcDbIdPair idPair(rId,

AcDbObjectId::kNull, kFalse);

idMap.assign(idPair);

}

}

}

}

pObj->close();

}

delete pIter;

pDict->close();

}


Содержание раздела