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 в этом параметре.