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

Цей технічне Примітка пояснює, як увімкнути квартира модель threading в елемент керування ActiveX. Зверніть увагу, що квартира модель threading підтримується лише в Visual C++ версії 4.2 або пізнішої версії.

Що таке Threading квартира моделі?

Квартира моделі є підхід до підтримки впроваджені об'єкти, такі як елементи керування ActiveX, в межах контейнерних багатопоточних додатків. Хоча застосування може мати декілька потоків, кожен екземпляр впровадженого об'єкта призначається один "квартиру," виконання лише одному потоці. Іншими словами, всі дзвінки в екземпляра елемента керування буде відбуватися в тому ж потоці.

Однак, різні екземпляри цього типу елемента керування можуть бути віднесені до різних квартирах. Таким чином, якщо кілька екземплярів елемента керування поділитися будь-яких даних спільного (наприклад, статичні або глобальні дані), то доступ до загальних даних необхідно бути захищений об'єкт синхронізації, такі, як критично розділу.

Повну інформацію на квартиру, threading моделі, див процеси і потоки в OLE програміста посилання.

Чому підтримки нитей квартира модель?

Елементів керування, які квартири модель threading може використовуватися в додатках багатопоточних контейнер, що також підтримує квартири моделі. Якщо не ввімкнути квартира модель threading, буде обмежити потенційні набір контейнери, у яких можна використовувати вашого контролю.

Увімкнення квартира модель threading є легким для більшості елементів керування, особливо якщо вони мають мало або немає спільних даних.

Захист спільних даних

Якщо вашого контролю використовує спільних даних, таких як змінної статичного члена доступ до що дані повинні бути захищені з критичної секції, щоб заборонити змінення даних у той же час більш ніж один потік. Щоб встановити критичної секції для цієї мети, оголосити статичного члена змінну класу CCriticalSection в свій контроль клас. Використовувати функції Блокування і розблокування член критичної секції об'єкта, скрізь, де ваш код доступ до загальних даних.

Розглянемо, наприклад, керування клас, який повинен підтримувати рядок, які поділяють всі зразки. Цей рядок можна зберегти у змінній статичного члена і захищені критичної секції. Декларація клас елемента керування буде містити такі:

клас CSampleCtrl: Громадська COleCo&ntrol
{
 nbsp;  ...
    статичний CString _strShared;
    статичний CCriticalSection _critSect;
}

Реалізація для класу буде включати визначення для цих змінних:

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

Доступ до до _strShared статичних член потім можуть бути захищені критичної секції:

недійсним CSampleCtrl::SomeMethod()
{
 nbsp;  _critSect.LOCK();
    Якщо (_strShared.Empty())
        _strShared = "<text>";
    _critSect.Unlock();
    ...
}

Реєстрація квартира модель Aware контролю

Елементів керування, які threading квартира моделі слід вказати таку можливість в реєстрі, додавши іменовані значення "ThreadingModel" зі значенням "Квартира" в їх клас ID запис реєстру під ідентифікатор класу\InprocServer32 ключ. Щоб викликати цей ключ, автоматично зареєстровані для вашого контролю, пройти в afxRegApartmentThreading прапор у шостому параметра, щоб AfxOleRegisterControlClass:

BOOL CSampleCtrl::CSampleCtrlFactory::UpdateRegistry(BOOL bRegister)
{
    Якщо (bRegister)
        повернення 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