Поделиться через


TN064. Потоки изолированной модели в элементах управления ActiveX

Примечание

Следующее техническое примечание не было обновлено, поскольку сначала оно было включено в электронную документацию.В результате некоторые процедуры и разделы могут быть устаревшими или неверными.Для получения последних сведений рекомендуется выполнить поиск интересующей темы в алфавитном указателе документации в Интернете.

Это техническом примечании объясняется, как включить модель изоляции передавая накапливаемое значение в элементе управления ActiveX. Обратите внимание, что потоки модели изоляции поддерживается только в версии Visual C++ 4.2 C или позже.

Что модель изоляции продевает потоков?

Модель изоляции подход к внедренным вспомогательные объекты, такие как элементы управления ActiveX, внутри многопоточного приложения. Хотя приложение может иметь несколько потоков, каждый экземпляр внедренного объекта будет присвоен один «,» подразделение, выполняется только на одном потоке. Другими словами, все вызовы в экземпляр элемента управления будут выполнены в том же потоке.

Однако различные экземпляры одного типа элемента управления могут быть присвоены к различным подразделениям. Таким образом, если несколько экземпляров элемента управления используют любые данные в общем (например, статический или глобальных данных), доступ к этим данным будет общим должен быть защищен объектом синхронизации, например критичный участок.

Дополнительные сведения о потоковой модели " Подразделение " см. в разделе Процессы и потоки в справочнике программиста OLE.

Почему поддержка потоков модели изоляции?

Элементы управления, которые поддерживают потоки изоляции модели можно использовать в многопоточном приложение-контейнерах, также поддерживают модель изоляции. Если не включить модель изоляции передавая накапливаемое значение отсутствует, появится возможность ограничить набор контейнеров, в которых элемент управления может использоваться.

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

Защита общие сведения

Если элемент управления использует общие данные, такие как переменная статического члена, доступ к этому, эти данные должны быть защищены критической секцией для предотвращения несколько потоков из изменять данные одновременно. Для настройки критическую секцию для этой цели объявите переменную статический элемент класса CCriticalSection в классе элемента управления. Используйте Lock и функции-члены Разблокировать этого объекта критической секции, для них собственный код обращается к общим данным.

Рассмотрим, например, класс элемента управления, который должен поддерживать строку, используется всеми экземплярами. Эта строка может храниться в переменной статического члена и защита критической секцией. Объявление класса элемента управления, содержит следующее:

class CSampleCtrl : public COleControl
{
    ...
    static CString _strShared;
    static CCriticalSection _critSect;
};

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

int CString CSampleCtrl::_strShared;
CCriticalSection CSampleCtrl::_critSect;

Доступ к статическому члену _strShared затем может быть защищен критической секцией.

void CSampleCtrl::SomeMethod()
{
    _critSect.Lock();
    if (_strShared.Empty())
        _strShared = "<text>";
    _critSect.Unlock();
    ...
}

Зарегистрировать элемент управления Подразделение-Модель- информации об электропитании

Элементы управления, которые поддерживают потоки модели изоляции указать эту возможность в реестре, путем добавления именованное значение «ThreadingModel» со значением «,» в их записи реестра идентификатора класса в ключом InprocServer32 id\ класса. Чтобы вызвать этот ключ автоматически, должна быть зарегистрирована для элемента управления, передайте флажок afxRegApartmentThreading в параметре шестом в AfxOleRegisterControlClass:

BOOL CSampleCtrl::CSampleCtrlFactory::UpdateRegistry(BOOL bRegister)
{
    if (bRegister)
        return AfxOleRegisterControlClass(
            AfxGetInstanceHandle(),
            m_clsid,
            m_lpszProgID,
            IDS_SAMPLE,
            IDB_SAMPLE,
            afxRegApartmentThreading,
            _dwSampleOleMisc,
            _tlid,
            _wVerMajor,
            _wVerMinor);
    else
        return AfxOleUnregisterClass(m_clsid, m_lpszProgID);
}

Если проект был создан ControlWizard элемента управления в версии 4.1 Visual C или C++ позже, то этот флажок уже будет в коде. Никакие изменения не требуются для регистрации потоковой модели.

Если проект был создан в более ранней версии ControlWizard, в существующий код будут иметь логическое значение шестой как параметр. Если существующий параметр ИСТИНЕН, измените его в afxRegInsertable | afxRegApartmentThreading. Если существующий параметр ЛОЖЕН, измените его в afxRegApartmentThreading.

Если элемент управления не удовлетворяет правилам для модели изоляции передавая накапливаемое значение, не следует передавать afxRegApartmentThreading в этом параметре.

См. также

Другие ресурсы

Технические примечания по номеру

Технические примечания по категории