Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Shpora_ROD_1.docx
Скачиваний:
1
Добавлен:
01.03.2025
Размер:
1 Мб
Скачать
☆

Билет №14

1. Цепочечное планирование

Цепочечное планирование базируется на следующих принципах:

        1. разрешается выполнение цепочки операций на одном шаге управления,

        2. под цепочкой понимается последовательность операций, в которой соседние операции соединены дугой, описывающей отношение непосредственного предшествования,

        3. время шага управления tstep может быть больше суммарного времени выполнения операций в цепочке,

        4. цепочечное планирование может сократить число шагов управления,

        5. многошаговое планирование увеличивает загрузку оборудования по сравнению с обыкновенным планированием.

        6. цепочечное планирование может использоваться совместно с многошаговым планированием.

2. Интерфейс iClassFactory

Клиент использует интерфейс фабрики класса и создает компонент посредством вызова функции IClassFactory::CreateInstance, возвращающей указатель на запрашиваемый интерфейс компонента (с этой целью клиент может использовать функцию CoCreateInstance).

IClassFactory – это стандартный интерфейс, который поддерживают фабрики класса для создания компонентов. Объявление интерфейса:

interface IClassFactory : IUnknown {

HRESULT __stdcall CreateInstance(IUnknown* pUnknownOuter, IID& iid, void** ppv);

HRESULT __stdcall LockServer(BOOL bLock);

};

Функция CreateInstance предназначена для создания компонентов. Ее параметр pUnknownOuter - указатель на внешний интерфейс IUnknown, используемый при агрегировании компонентов. С помощью параметров iid и ppv функция может получить один из интерфейсов создаваемого компонента. CreateInstance не получает в качестве параметра CLSID. Это означает, что данная функция может создавать компоненты, соответствующие только одному CLSID — тому, который получает на входе функция CoGetClassObject, создающая фабрику класса.

Задача - Привести пример подключения интерфейса IUnknown.

Клиент всегда взаимодействует с компонентом через некоторый интерфейс. Даже для запроса интерфейса у компонента клиент использует специальный интерфейс IUnknown. Определение IUnknown, содержащееся в заголовочном файле unknwn.h, входящем в состав Win32 SDK, выглядит так:

interface IUnknown {

virtual HRESULT __stdcall QueryInterface(const IID& iid, void** ppv) = 0;

virtual ULONG __stdcall AddRef() = 0;

virtual ULONG __stdcall Release() = 0;

}

Поскольку все интерфейсы СОМ наследуют IUnknown, в каждом интерфейсе есть функции QueryInterface, AddRef и Release —первые три функции в vtbl:

interface IType_1 : IUnknown { virtual void __stdcall operT1(int, int, int*) = 0; };

Все интерфейсы СОМ можно полиморфно трактовать как интерфейсы IUnknown. Поскольку все указатели интерфейсов являются также и указателями на IUnknown, клиенту не требуется хранить отдельный указатель на компонент. Клиент работает только с указателями на интерфейсы. Для получения указателя на IUnknown используется вместо оператора new функция

IUnknown* CreateInstance();

Она создает компонент и возвращает указатель на IUnknown:

class COMPFactory : public IClassFactory {

public: // IUnknown

virtual HRESULT __stdcall QueryInterface(const IID& iid, void** ppv);

virtual ULONG __stdcall AddRef();

virtual ULONG __stdcall Release();

// IClassFactory

virtual HRESULT __stdcall CreateInstance(IUnknown* pUnknownOuter,

const IID& iid, void** ppv);

virtual HRESULT __stdcall LockServer(BOOL bLock);

COMPFactory() : m_cRef(1) {}

private:

long m_cRef;

};

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]