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

2. Функции CoGetClassObject и DllGetClassObject и их использование

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

HRESULT __stdcall CoGetClassObject(

CLSID& clsid,

DWORD dwClsContext,

COSERVERINFO* pServerInfo,

IID& iid,

void** ppv

);

где clsid – глобально уникальный идентификатор класса; dwClsContext - контекст выполнения; pServerInfo - Зарезервировано для DCOM; iid – идентификатор интерфейса; ppv – адрес интерфейса IClassFactory.

Существенное различие между CoGetClassObject и CoCreateInstance состоит в том, что первая возвращает указатель, относящийся к фабрике класса нужного нам компонента, а не к самому компоненту. Требуемый компонент создается при помощи интерфейса, указатель на который возвращает CoGetClassObject.

Программист может сам создавать фабрику класса, используя CoGetClassObject. Но это серьезная работы, поэтому предпочтительнее использовать функцию CoCreateInstance, которая создает фабрику класса, получает указатель на IClassFactory и затем создает компонент. Вот почему в большинстве программ используется CoCreateInstance, а не CoGetClassObject. Функция CoCreateInstance реализована с помощью CoGetClassObject.

Компонент-фабрика класса в большинстве случаев содержится в той же DLL, что и создаваемый компонент. Конкретный экземпляр фабрики класса соответствует одному конкретному CLSID, и как фабрика, так и создаваемый ею компонент реализуются одним и тем же программистом.

Функции CoGetClassObject также нужна точка входа DLL для создания фабрики класса компонента, которая реализована в одной DLL с компонентом. Эта точка входа называется DllGetClassObject. CoGetClassObject вызывает функцию DllGetClassObject, которая в действительности создает фабрику класса. Объявление DllGetClassObject:

STDAPI DllGetClassObject(

CLSID& clsid,

IID& iid,

void** ppv

);

где clsid - идентификатор класса компонентов, которые будет создавать фабрика класса; iid - идентификатор интерфейса фабрики; ppv - указатель на этот интерфейс.

Задача - Привести пример графа задач

Граф задач – это ориентированный ациклический граф G=(V, E), где

V – множество узлов, |V| = v, представляющих задачи, каждая из которых описывается множеством инструкций (операторов), выполняемых последовательно на одном процессоре;

E – множество дуг |E| = e, представляющих передаваемые данные и отношения предшествования между узлами.

Вершина ni графа метится числом w(ni), описывающим время решения задачи. Дуга (i,j) графа метится числом cij, описывающим время передачи данных от задачи ni к задаче nj.

Входным называется узел, не имеющий входящих дуг. Выходным называется узел, не имеющий исходящих дуг.

Задача не может начать выполнение не получив данные от родительских задач.

К оэффициентом «коммуникация/вычисление» (communication-to-computation ratio - CCR) графа задач называется отношение среднего времени передачи данных от одной задачи к другой к среднему времени решения задачи.

Решение задач может происходить параллельно с передачами данных. Время передачи данных между двумя задачи, равное cij в исходном графе, принимается равным нулю при назначении задач на один процессор.

Пример графа задач дан на рис.1. Он включает четыре задачи n1, n2, n3, n4, имеющие время решения 5, 20, 10 и 8 единиц каждая. Время передачи данных между задачами n1, n2 составляет 1 единицу, между задачами n1, n3 – 20 единиц, между задачами n2, n4 – 1 единицу, между задачами n3, n4 – 10 единиц. Время реализации графа задач определяется суммарным весом всех узлов и дуг наиболее длинного пути на графе и равно 54. Коэффициент «коммуникация/вычисление» CCR=0.73.

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