Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.01.06;
Скачать: CL | DM;

Вниз

Best practice в создании свойств-списков объектов в COM в многопо   Найти похожие ветки 

 
Slym ©   (2007-12-07 12:43) [0]

Какой Best practice в создании свойств-списков объектов в COM в многопоточных приложениях?
Имеем многопоточное приложение и интерфейсы:

////Член списка ciInternal/tmSingle
ITTestItem = interface(IDispatch)
  ["{350F0451-E8B4-42AE-A817-F83D112AD269}"]
  function Get_Data: Integer; safecall;
  property Data: Integer read Get_Data;
end;
ITTestItemDisp = dispinterface
  ["{350F0451-E8B4-42AE-A817-F83D112AD269}"]
  property Data: Integer readonly dispid 201;
end;

////Сам список в нем же будет реализован и Enum   ciInternal/tmSingle или ciInternal/tmApartment ?
ITTest = interface(IDispatch)
  ["{9C3922E1-A24C-417D-B052-EE2940AFD628}"]
  function Get_Items(Index: Integer): ITTestItem; safecall;
  function Get_Count: Integer; safecall;
  function Add: ITTestItem; safecall;
  function _NewEnum: IUnknown; safecall;
  property Items[Index: Integer]: ITTestItem read Get_Items;
  property Count: Integer read Get_Count;
end;
ITTestDisp = dispinterface
  ["{9C3922E1-A24C-417D-B052-EE2940AFD628}"]
  property Items[Index: Integer]: ITTestItem readonly dispid 201;
  property Count: Integer readonly dispid 202;
  function Add: ITTestItem; dispid 203;
  function _NewEnum: IUnknown; dispid -4;
end;

////Объект-владелец списка ciSingleInstance/tmApartment
ITApp = interface(IDispatch)
  ["{426980CD-6720-4337-BE7A-82DA53343CBE}"]
  function Get_Test: ITTest; safecall;
  property Test: ITTest read Get_Test;//То самое свойство
end;


1. Как реализовать возврат списка?
1.1. Создавать новую копию списка каждому запросившему, но при этом будут недоступны изменения в списке без запроса новой копии
1.2. Выдавать ссылку на имеющийся общий список, тогда как синхронизировать доступ к нему или оставить это для COM и играться настройками поточности апартмента (хотя в это с трудом верится)
2. О потоко безопасности члена списка позаботится COM есля я выставлю ТредМодельSingle?


 
Сергей М. ©   (2007-12-07 12:57) [1]


> 2.


Ради упрощения алгоритма я бы положился на tmSingle


 
Slym ©   (2007-12-07 13:10) [2]

Сергей М. ©   (07.12.07 12:57) [1]
tmSingle

тогда толучается
Создавать новую копию списка каждому запросившему


 
Сергей М. ©   (2007-12-07 13:11) [3]


> Slym ©   (07.12.07 13:10) [2]


Не проще ли ввести пару методов Lock/Unlock ?


 
Slym ©   (2007-12-07 13:14) [4]

хочется чтоб красиво было... в ADO видел Lock/Unlock? и это красиво (к ветке о красивости кода)


 
Сергей М. ©   (2007-12-07 13:15) [5]

С др.стороны, почему бы и не копия ?

Можно же реализовать все это по образу и подобию транзакционного механизма в серверах-версионниках ..

И так ли уж обязателен список ? Может енумератор удобней будет ?


 
DrPass ©   (2007-12-07 13:16) [6]


> Не проще ли ввести пару методов Lock/Unlock ?

Когда делаешь СОМ-объект, лучше по максимуму сделать его независимым от глупости/невнимательности разработчиков, которым он достанется. Поэтому я бы все-таки ограничился tmSingle


 
Сергей М. ©   (2007-12-07 13:17) [7]


> в ADO видел Lock/Unlock?


В один и тот же ADO-интерфейс ты и не сунешься из многих потоков одновременно - отлуп тут же получишь)


 
Slym ©   (2007-12-07 13:19) [8]

Сергей М. ©   (07.12.07 13:17) [7]
а мне какраз многопоточный синглетон в итоге нужен со списком объектов, ядро будет объекты обновлять, клиенты объекты обрабатывать


 
Slym ©   (2007-12-07 13:23) [9]

в идеале потом туда SQL присобачить какнить, типа как в WMI сделано "SELECT Item from core where item.ID=1" :) но это потом


 
Сергей М. ©   (2007-12-07 13:27) [10]


> мне какраз многопоточный синглетон в итоге нужен


Тогда АДО как пример неудачен.


> ядро будет объекты обновлять, клиенты объекты обрабатывать


Механизм ивентов и/или колбэков тоже не подходит в кач-ве альтернативы списочному взаимодействию между сервером и контроллерами ?


 
Slym ©   (2007-12-10 07:37) [11]

Определился... Будет выдаваться копия списка как ciInternal/tmSingle, + метод типа Refresh(Requery) для обновления

Вопрос №2
Как Вы реализуете освобождение обектов при кросс-ссылочной организации взаимодействия объектов, т.е. разруливаете ситуацию с дедлоком освобождения ссылки 2х и более объектов друг на друга
Список хранит ссылки на итемы, но итемы тоже хранят ссылку на список


 
Slym ©   (2007-12-10 07:44) [12]

Сергей М. ©   (07.12.07 13:27) [10]
Механизм ивентов и/или колбэков тоже не подходит в кач-ве альтернативы списочному взаимодействию между сервером и контроллерами ?

это тоже конечно будет, но для начала плацдарм подготовлю...
будет 2 типа евентов: OnCountChanged и OnItemChanged

Сергей М. ©   (07.12.07 13:15) [5]
Может енумератор удобней будет

Без этого тоже никуда... возможно к объекту будут из всяких VB(А) конектится



Страницы: 1 вся ветка

Текущий архив: 2008.01.06;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.011 c
2-1197224693
slavon
2007-12-09 21:24
2008.01.06
Создание массива компонентов в real-time


15-1196606871
Lip
2007-12-02 17:47
2008.01.06
ACM турниры и реальные задачи! Какая связь?


15-1196257475
em240
2007-11-28 16:44
2008.01.06
.net+производительность gui приложений


2-1197279695
fics
2007-12-10 12:41
2008.01.06
Мерцание раб области


15-1196479897
Ricks
2007-12-01 06:31
2008.01.06
Кто у нас силен в математике?