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


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

ПримечаниеПримечание

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

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

Которого Квартир-Модель потоке?

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

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

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

Почему поддержка потоков Квартир-Модели?

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

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

Защита общих источников

Если элемент управления использует распространенные источники, как переменная статического члена, доступ к этому, то данные должны быть защищены с критической секцией для предотвращения несколько потоков от изменения данных в одно и то же время.Для настройки критическую секцию для этой цели объявите переменную статического члена класса 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.Чтобы вызвать данную клавиши автоматически, зарегистрированных для элемента управления, передайте пометить 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 элемента управления в Visual C++ версии 4.1 или более поздней, то этот пометить уже будет в коде.Никакие изменения не требуются, чтобы зарегистрировать потоковая модель.

Если проект был создан в более ранней версии ControlWizard, то существующий код будет иметь логическое значение, как шестой параметр.Если параметр имеет значение true, измените его в afxRegInsertable | afxRegApartmentThreading.Если параметр равен false, измените его в afxRegApartmentThreading.

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

См. также

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

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

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