TN064: Квартира модель потоков в элементы управления ActiveX

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

Что такое-модель потоков?

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

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

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

Почему квартира модель потоков?

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

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

Защита общих данных

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

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

класс CSampleCtrl: государственные COleCo&ntrol
{
 nbsp;  ...
    статические CString _strShared;
    статические CCriticalSection _critSect;
}

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

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

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

void CSampleCtrl::SomeMethod()
{
 nbsp;  _critSect.Lock();
    Если (_strShared.Empty())
        _strShared = «<text>»;
    _critSect.Unlock();
    ...
}

Регистрация квартиры модель сознающий управления

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

BOOL CSampleCtrl::CSampleCtrlFactory::UpdateRegistry(BOOL bRegister)
{
    Если (bЗарегистрируйтесь участия)
        возвращение AfxOleRegisterControlClass)
            AfxGetInstanceHandle(),
            m_clsid,
            m_lpszProgID,
            IDS_SAMPLE,
            IDB_SAMPLE,
            afxRegApartmentThreading,
            _dwSampleOleMisc,
            _tlid,
            _wVerMajor,
            _wVerMinor);
    остальное
        возвращение AfxOleUnregisterClass (m_clsid, m_lpszProgID);
}

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

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

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

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

Index